我一直在尝试使用jq解析器来帮助我从json文件中提取信息。
以下是一个示例代码段
{
"main_attribute": {
"name": {
"display_name": "abc"
},
"address": {
"unit": "1",
"street": "Dundas",
"suburb": "Syd",
"state": "NSW"
},
"financial_debt": {
"bank_loan": true
}
},
"secondary_attr": {
"income": {
"pretax": 100000
},
"automobile": {
"make": "Citroen",
"model": 2015,
"new": true
},
"property": {
"property_owned": 1,
"owned_since": 2000,
"first_sale": true
},
"education": {
"degree": "MS",
"graduated": 1990,
"financial_debt": {
"bank_loan": false
}
}
}
}
我需要找到“financial_debt”为真的块。该字段可以是main_attribute(作为全局值),也可以是辅助属性。
预期产出:
financial_debt:关于“汽车”和“财产”的bank_loan
你能告诉我如何使用jq进行搜索吗?
答案 0 :(得分:1)
这绝不是最有效的方法,但它是有效的。它返回一个布尔值,指定true
属性下是否有financial_debt
布尔值。
jq '[recurse | .financial_debt? | select(. != null) | recurse | booleans] | any'
答案 1 :(得分:0)
tostream 可用于查找包含"financial_debt"
的路径,如下所示:
tostream
| select(length==2)
| select(.[0] | contains(["financial_debt"]))
此filter.jq
中的此过滤器和data.json
$ jq -M -c -f filter.jq data.json
产生
[["main_attribute","financial_debt","bank_loan"],true]
[["secondary_attr","education","financial_debt","bank_loan"],false]
此中间结果可与 reduce , setpath , getpath 以及
等过滤器一起使用 . as $d
| reduce ( tostream
| select(length==2)
| select(.[0] | contains(["financial_debt"]))) as [$p,$v] (
{}
; setpath($p[:-1]; $d | getpath($p[:-1]))
)
生产
{
"main_attribute": {
"financial_debt": {
"bank_loan": true
}
},
"secondary_attr": {
"education": {
"financial_debt": {
"bank_loan": false
}
}
}
}