json - 使用JQ根据条件在特定位置注入元素
问题描述
把头发拉到这里,尝试使用jq来解析和扩展一个JSON文件,并根据一定的条件在特定位置添加一个元素。这是一个示例文件(也在https://jqplay.org/s/6cjmbnvrqu)
{
"TopA": { "stuff": "here"},
"TopB": {
"C591AB7E": {
"Type": "this",
"Properties": {
"lots": 1,
"of": 2,
"values" : 3
}
},
"7E16765A": {
"Type": "this",
"Properties": {
"lots": 4,
"of": 5,
"values" : 6
}
},
"AAD76465": {
"Type": "that",
"Properties": {
"lots": 7,
"of": 8,
"values" : 9
}
}
}
}
目标是将元素添加到 .Type == "that" 的任何 TopB 子节点的 Properties 节点。更重要的是,我需要将子节点的键放入带有添加前缀的新元素值中。所以基本上我需要最后一个元素看起来像这样:
"AAD76465": {
"Type": "that",
"Properties": {
"lots": 7,
"of": 8,
"values": 9,
"newElement": "Prefix-AAD76465"
}
}
我还需要保留文件的整个其余部分(或就此而言的新文件)。所以我不需要查询,而是需要一个 jq 调用来操作现有文件。与 TopB 平行,文件中可能还需要其他元素。不,我不知道,我也无法控制 TopB 的孩子的命名。我所拥有的只是我的目标是带有.Type ==“that”的TopB 的嵌套子级。可以有多个。
感谢您的关注。
解决方案
如果您获得了将首先添加新字段的路径,则可以简单地从中提取父键。
reduce path(.TopB[] | select(.Type == "that") .Properties.newElement) as $p (.; setpath($p; "Prefix-\($p[1])"))
推荐阅读
- laravel - Laravel 用户有目标,用户必须针对目标进行销售,所以我想根据目标日期获取用户的销售数据
- php - 在 xml 文件中使用 PHP 代码回显某些内容
- php - 如何在多对多关系中更新数据透视表的数据
- c# - 在组合框中显示来自 DataGridviewImageColumn 的图像
- firebase - 如何将 Flutter Web 应用程序部署到托管在 Firebase 上的现有网站?
- jquery - 光滑的滑块在循环中无法正常工作
- python - RPi 模拟键盘,如何发送某些键码(左元)?
- javascript - 仅返回 1 个值时如何使此 removeMiddle 测试通过
- firebase - 即使应用程序在颤动中被杀死,如何将用户位置发送到 Firestore?
- function - Iterable.expand(Iterable Function(dynamic) f) 函数在 Dart 中是如何工作的?