使用jq通过子节点选择器获取父节点

使用jq通过子节点选择器获取父节点

我正在尝试用 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指示打印步行条目的标签

jtcPS> 披露:我是该工具的创建者

相关内容