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. #!/usr/bin/env bash
  2. __main() {
  3. _Json=$(
  4. _time1=$(date '+%s')
  5. _time2=$(date -d @"$_time1" +'%Y-%m-%d %T')
  6. echo "{}" |
  7. jq --arg v "$_time1" '.time[0]=$v' |
  8. jq --arg v "$_time2" '.time[1]=$v' |
  9. jq --arg v "200" '.code=$v' |
  10. jq --argjson v "[1,2,3]" '.data=$v' |
  11. jq -c
  12. )
  13. echo "$_Json"
  14. }
  15. __main
  1. {"time":["1667648450","2022-11-05 19:40:50"],"code":"200","data":[1,2,3]}

场景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