2

我的 json 文件 'veggies.json' 如下:

{"plants":
  {"veggies":
    [
      {"section":"TUBERS",
        "values":
          [
            {"tuber":"potato","type":"stem"}
          ]
      },
      {"section":"LEGUMES",
        "values":
          [
            {"legume":"beans"},
            {"legume":"peanuts"}
          ]
      }
    ]
  }
}

我想添加另一个块茎“山药”,它是“根”类型的 - 这必须在 TUBERS 部分下。

我刚开始使用 JSON,我一直在用各种 jq 命令打破我的头脑,但没有多大用处。

我尝试使用以下命令读取 values[0] 处的值,但我似乎无法列出任何内容:

jq -r "[.[] | select(.plants.veggies.section == \"TUBERS\") | .plants.veggies.values.tuber]" veggies.json

从本质上讲,我正在努力实现这一点 - 如果植物部分是 TUBERS,则添加块茎“山药”,它是“根”类型

有人可以帮我吗?

哦,我坚持使用 jq 版本 1.2,如果这很重要(向后兼容性和所有这些东西)。

非常感谢提前。

4

2 回答 2

2

没关系 - 经过更多的头脑风暴,我想我明白了:

cat veggies.json | jq '.plants.veggies[] | select(.section == "TUBERS") | .values |= . + [{ "type": "root", "tuber": "yam" }]'

这似乎做我想要的:

{
  "values": [
    {
      "type": "stem",
      "tuber": "potato"
    },
    {
      "tuber": "yam",
      "type": "root"
    }
  ],
  "section": "TUBERS"
}

如果有人可以进一步优化这一点,我也非常渴望了解这一点。

于 2014-09-08T18:34:14.757 回答
2

试试这个:

jq '(.plants.veggies[] | select(.section == "TUBERS") | .values) |= . + [{"type": "root", "tuber": "yam"}]' veggies.json

这将运行一个子过滤器:选择 veggies 数组的元素,找到具有匹配部分的元素并产生值 varray。然后它将对象附加到值数组。

这与您自己的答案中的过滤器基本相同,但有一个关键区别:因为您实际上并未从主要输入数据中过滤出任何内容,所以它将打印出整个 JSON 文档(而不仅仅是修改的部分)。我不确定这是否对您有好处,但它使在脚本中修改整个文档变得非常容易。

(在 jq 1.3 上测试)

于 2014-09-08T18:55:50.830 回答