jq:通过shell变量追加JSON对象

简单的数据

  1. __func() {
  2. _storage_size="100"
  3. _storage_used="200"
  4. _storage_avail="300"
  5. echo '{}' | jq \
  6. '.storage_size +="'$_storage_size'"' | jq \
  7. '.storage_used +="'$_storage_used'"' | jq \
  8. '.storage_avail +="'$_storage_avail'"' | jq
  9. }
  10. __func
  1. {
  2. "storage_size": "100",
  3. "storage_used": "200",
  4. "storage_avail": "300"
  5. }

复杂数据场景

场景1

  1. _json=$(
  2. echo '{}' |
  3. jq --arg v "$(date +"%Y-%m-%d %T")" '.time[0]=$v' |
  4. jq --arg v "$(date '+%s')" '.time[1]=$v' |
  5. jq --arg v "200" '.code=$v' |
  6. jq --argjson v "[]" '.data=$v' -c
  7. )
  8. echo "$_json" | jq

场景2

  1. __func() {
  2. _obj_name="obj_name"
  3. _obj_json='{ "test": "json" }'
  4. echo '{ "data": {} }' | jq \
  5. --arg objectName "$_obj_name" \
  6. --argjson jsonString "$_obj_json" \
  7. '.data[$objectName] += $jsonString'
  8. }
  9. __func
  1. {
  2. "data": {
  3. "obj_name": {
  4. "test": "json"
  5. }
  6. }
  7. }

split

使用 split 将字符串转换为数组

  1. echo '"aa bb cc"' | jq 'split(" ")'
  1. [
  2. "aa",
  3. "bb",
  4. "cc"
  5. ]

简单理解, 这里把 jq 理解为一款变成语言
第 2 3 行 定义 Shell 环境变量
第 5 6 行定义 jq 预处理变量 --arg--argjson 相当于 jq 的变量类型
第 7 行, 也就是 jq 的代码了, 内部的 $jsonString 数据 jq 变量, 而不是 Shell 环境变量

http://ask.sov5.cn/q/ZjtdvZgsJ9


相关连接

如何删除jq输出中用于解析bash中的json文件的双引号? http://cn.voidcc.com/question/p-dqzfaxft-uw.html
jq&bash:从变量中生成JSON数组 https://oomake.com/question/6505361
https://stedolan.github.io/jq



https://stedolan.github.io/jq/manual/#Invokingjq