jq 可以从变量中解析多个级别的键吗?

问题描述 投票:0回答:1

我有一个json文件:

{
  "rec_9M":
    {
    "id":"000",
    "rec_E":
        [
          {
            "id":"111"
          } ,
          {
            "id":"222"
          }           
        ]
    }
}

我需要更改值rec_9M.rec_E[].id,但我需要为此使用通用bash函数,该函数可用于更改不同级别上的值(rec_9M.id或rec_9M.rec_E[].files[]。 id)

我尝试过:

VAR=rec_9M.rec_E[]
NUM=555

echo $(cat config.json) | jq --arg VAR_I $VAR --arg NUM_I $NUM '.[$VAR_I].id = $NUM_I' > config_t.json
cat config_t.json 

预计: enter image description here

{
  "rec_9M": {
    "id": "000",
    "rec_E": [
      {
        "id": "555"
      },
      {
        "id": "555"
      }
    ]
  }
}

现实: enter image description here

{
  "rec_9M": {
    "id": "000",
    "rec_E": [
      {
        "id": "111"
      },
      {
        "id": "222"
      }
    ]
  },
  "rec_9M.rec_E[]": {
    "id": "555"
  }
}

如果密钥是硬编码的 - 一切正常。:

echo $(cat config.json) | jq --arg VAR_I $VAR --arg NUM_I $NUM '.rec_9M.rec_E[].id = $NUM_I' > config_t.json

我还尝试了在 jq 中使用 VAR_I 与引号和特殊符号的任何组合,例如“($VAR_I)”。结果是一样的还是jq解析错误。

也许有人知道解决方案吗?

bash variables jq
1个回答
0
投票

一种方法使用

getpath()
基于变量(或其他字符串)提取输入 JSON 的路径:

$ jq --arg path "rec_9M.rec_E" --arg i 555 'getpath($path | split("."))[] += {id: $i}' config.json
{
  "rec_9M": {
    "id": "000",
    "rec_E": [
      {
        "id": "555"
      },
      {
        "id": "555"
      }
    ]
  }
}

注意将尾随

[]
离开路径。


echo $(cat config.json)
有很多问题。
jq
以JSON文档的文件名作为参数;用那个。或者,如果您打算将
cat config.json | jq ...
部分替换为更复杂的内容(例如
cat
请求或输出 JSON 的其他命令),那么甚至无用地使用 Cat(例如
curl
)作为示例也可以...但不要组合与
echo
一起使用。除了引入不必要的步骤之外,如果您的 shell 版本的
echo
执行诸如用文字换行符替换
\n
之类的操作,那么如果 JSON 中的字符串中存在转义序列,它将破坏其他所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.