Json 使用JQ根据条件在特定位置注入元素

Json 使用JQ根据条件在特定位置注入元素,json,select,key,jq,Json,Select,Key,Jq,这里是我的重点,尝试使用jq解析和扩展JSON文件,并根据特定条件在特定位置添加元素。 这是一个示例文件(也位于) 目标是向任何TopB子级的Properties节点添加一个元素,其中.Type==“that”。更重要的是,我需要将子节点的键放入带有附加前缀的新元素值中。 所以本质上我需要最后一个元素如下所示: "AAD76465": { "Type": "that", "Properties": {

这里是我的重点,尝试使用jq解析和扩展JSON文件,并根据特定条件在特定位置添加元素。 这是一个示例文件(也位于)

目标是向任何TopB子级的Properties节点添加一个元素,其中.Type==“that”。更重要的是,我需要将子节点的键放入带有附加前缀的新元素值中。 所以本质上我需要最后一个元素如下所示:

"AAD76465": {
  "Type": "that",
  "Properties": {
    "lots": 7,
    "of": 8,
    "values": 9,
    "newElement": "Prefix-AAD76465"
  }
}
我还需要保留整个文件的其余部分(或者为此保留一个新文件)。因此,我不需要查询,而是需要一个jq调用来操作现有文件。与TopB并行,文件中可能还需要其他元素。不,我不知道,我也不能控制TopB孩子的名字。我所拥有的只是我的目标是TopB的嵌套子对象,其.Type==“that”。可以有多个


感谢您的查找。

如果您获得了要首先添加新字段的路径,您只需从中提取父项即可

reduce path(.TopB[] | select(.Type == "that") .Properties.newElement) as $p (.; setpath($p; "Prefix-\($p[1])"))

以下是一个使用
walk/1
的解决方案,因此可能非常直观:

walk(if (type == "object") and .TopB
     then .TopB |= with_entries( 
       .key as $key
       | if .value.Type == "that" 
         then .value.Properties += { newElement: ("Prefix-" + $key) }
         else . end)
     else . end)
此解决方案的一个优点是它满足规定的要求:

目标是将元素添加到任何TopB子级的Properties节点

在这个意义上,没有对使用“topB”键的对象的位置进行假设

walk(if (type == "object") and .TopB
     then .TopB |= with_entries( 
       .key as $key
       | if .value.Type == "that" 
         then .value.Properties += { newElement: ("Prefix-" + $key) }
         else . end)
     else . end)