用jq添加JSON对象时如何防止转义?

时间:2019-07-03 21:57:41

标签: json bash jq

我正在使用jq,正在尝试将新的JSON对象添加到现有文件的新密钥中。

我有以下JSON文件 foobarbaz.json

{
    "example":{
        "name": "stackOverflowQuestion"
    }
}

我想在示例下添加一个新条目,以便在 foobar.json

中获得以下输出
{
    "example": {
        "name": "stackOverflowQuestion",
        "new": {
            "newfield": {
                "key": "value"
            }
        }
    }
}

我在终端中使用以下命令:

$ tempvar='{"newfield":{"key":"value"}}'
$ cat foobarbaz.json | jq '.example.new=env.tempvar' > foobar.json

但是, foobar.json 中的输出有些出乎意料:

{
  "example": {
    "name": "stackOverflowQuestion",
    "new": "{\"newfield\":{\"key\":\"value\"}}"
  }
}

为什么jq用大括号将大括号括起来,为什么它会转义双引号呢?

3 个答案:

答案 0 :(得分:3)

通过将其解码为JSON内容,使用fromjson将字符串(格式为 all 的环境变量都在其中!)转换为相应的数据结构。

tempvar='{"newfield":{"key":"value"}}' jq '.example.new=(env.tempvar | fromjson)' <<'EOF'
{
    "example":{
        "name": "stackOverflowQuestion"
    }
}
EOF

...作为输出发出:

{
  "example": {
    "name": "stackOverflowQuestion",
    "new": {
      "newfield": {
        "key": "value"
      }
    }
  }
}

答案 1 :(得分:2)

使用my_report2 <- function(x) { Report <- df %>% filter(Agents == x) %>% group_by(Month) %>% summarise(Skill = mean(Score1), Attitude = mean(Score2)) } map(df$Agents %>% unique, my_report2) 选项将预先存在的JSON代码段作为变量传递给过滤器。

--argjson

请注意,$ jq --argjson x "$tempvar" '.example.new=$x' foobarbaz.json { "example": { "name": "stackOverflowQuestion", "new": { "newfield": { "key": "value" } } } } 不是严格必需的,如果仅将其定义为与过滤器配合使用,则可以将其删除:

tempvar

答案 2 :(得分:0)

作为一种替代性方法,有一种基于JSON的步行路径Unix工具, jtc

bash $ tempvar='{"newfield":{"key":"value"}}'
bash $ <foobarbaz.json jtc -w'[example]' -i"$tempvar" -T'{"new": {{}}}'
{
   "example": {
      "name": "stackOverflowQuestion",
      "new": {
         "newfield": {
            "key": "value"
         }
      }
   }
}
bash $  
    在插入之前,要插入的
  • 目标入口点(-iexample,然后对插入的JSON值进行模板插值(-T)以添加带有标签的封装new

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者