【问题标题】:Add JSON value in correct section在正确的部分添加 JSON 值
【发布时间】:2014-09-08 17:19:29
【问题描述】:

我的 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,如果这很重要(向后兼容性和所有这些东西)。

非常感谢。

【问题讨论】:

标签: json shell jq


【解决方案1】:

试试这个:

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

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

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

(在 jq 1.3 上测试)

【讨论】:

  • 哇——你是对的——你的打印了整个文档,而我的只是打印了我修改过的部分——以及我的代码的作用——这不好。我确实需要整个文件。非常感谢您的澄清。你有资源/链接我可以学习这些类型的东西吗(我写的代码显然是在对发生的事情知之甚少的情况下编写的)
  • 此功能在文档的Complex Assignments 部分进行了说明(一直到最后)。 IMO,这不是最清楚的,这就是它所显示的,但这就是我学会如何去做的地方。请参阅该页面上的最后一个示例。 (如果您认为它解决了问题,请不要忘记标记此答案旁边的复选框:D)
  • 嘿@0x783czar - 我注意到如果我多次执行相同的命令,代码会被多次添加。有没有办法在这个逻辑中执行“如果存在,编辑,否则添加”例程?
  • 一个小小的简化:你可以在这里写“+=”而不是“|= .+”。
【解决方案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"
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    相关资源
    最近更新 更多