我正在尝试用 jq 解析 json
{
"xxx": {
"aliases": {
"business_event": {
"is_write_index": true
}
},
"mappings": {
"business_event_doc": {
"properties": {
"clientName": {
"type": "keyword"
},
"componentName": {
"type": "keyword"
},
"correlationId": {
"type": "keyword"
},
"executionTime": {
"type": "long"
},
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
}
}
}
}
我需要构造一个属性列表,其中 type == "text",这样结果将如下所示:
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
我尝试过使用选择器,但结果无效
.xxx.mappings[].properties | select (.[].type=="text")
查询子节点并返回父节点的正确方法是什么?
答案1
问题与
.xxx.mappings[].properties | select(.[].type=="text")
是,select
将选择整个properties
对象(而不是数组)的次数与其中具有 的子对象一样多.type == "text"
。
您可以with_entries
在这里使用:
jq '.xxx.mappings[].properties | with_entries(select(.value.type == "text"))' file
这会迭代with_entries
属性。获取select
像这样的元素数组:
{
"key": "clientName",
"value": {
"type": "keyword"
}
}
挑选select
出元素.value.type == "text"
,然后将它们变回普通物体。
输出将是
{
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
请注意,JSON 文档不能包含“裸”键(键不是对象的一部分),因此您请求的输出的确切格式不是有效的 JSON。
答案2
如果您愿意考虑替代方案,那么这是一个基于 walk-path unix 实用程序的方案jtc
:
bash $ <file.json jtc -w'[type]:<text>:[-1]' -l
"fullDescription": {
"type": "text"
}
"shortDescription": {
"type": "text"
}
bash $
walk-path ( -w
) 在这里相当简单:
[type]:<text>:
- 将递归地找到 的每个(全部)"type": "text"
,然后从找到的条目中找到[-1]
- 将备份 1 级(Json 树),有效选择其父级
-l
指示打印步行条目的标签
jtc
PS> 披露:我是该工具的创建者