从嵌套数组中选择(Selecting from nested array)
鉴于此输入
{ "data": [ { "id": "001", "metadata": { "item1": 1 }, "records": [ { "name": "name1", "type": "type1" }, { "name": "name2", "type": "type2" } ] }, { "id": "002", "metadata": { "item1": 1 }, "records": [ { "name": "name1", "type": "type1" } ] }, { "id": "003", "metadata": {}, "records": [ { "name": "name1", "type": "type1" }, { "name": "name2", "type": "type2" } ] } ] }我想输出这个
[ { "id": "001", "Item1": 1, "Name": "name2" }, { "id": "002", "Item1": 1, "Name": null }, { "id": "003", "Item1": null, "Name": "name2" } ]但是使用这个
jq '[.data[] | {id, "Item1": .metadata.item1, "Name": .records[] | select(.type == "type2").name}]'jq查询我得到了这个
[ { "id": "001", "Item1": 1, "Name": "name2" }, { "id": "003", "Item1": null, "Name": "name2" } ]如何才能输出'002'id对象? 我已经尝试了各种if if else条件语句,但无济于事。
Given this input
{ "data": [ { "id": "001", "metadata": { "item1": 1 }, "records": [ { "name": "name1", "type": "type1" }, { "name": "name2", "type": "type2" } ] }, { "id": "002", "metadata": { "item1": 1 }, "records": [ { "name": "name1", "type": "type1" } ] }, { "id": "003", "metadata": {}, "records": [ { "name": "name1", "type": "type1" }, { "name": "name2", "type": "type2" } ] } ] }I am trying to output this
[ { "id": "001", "Item1": 1, "Name": "name2" }, { "id": "002", "Item1": 1, "Name": null }, { "id": "003", "Item1": null, "Name": "name2" } ]However using this
jq '[.data[] | {id, "Item1": .metadata.item1, "Name": .records[] | select(.type == "type2").name}]'jq query I am getting this
[ { "id": "001", "Item1": 1, "Name": "name2" }, { "id": "003", "Item1": null, "Name": "name2" } ]How can I get the '002' id object to output as well? I have tried various if then else conditions statements but to no avail.
最满意答案
我对jq很新,所以这可能不是最佳解决方案。
如果将select map到records数组,则不会删除周围的对象。 例如:
parse.jq
[ .data[] | { id : .id, Item1 : .metadata.item1, Name : .records | map(select(.type == "type2"))[0].name } ]像这样运行:
jq -f parse.jq file.json输出:
[ { "id": "001", "Item1": 1, "Name": "type2" }, { "id": "002", "Item1": 1, "Name": null }, { "id": "003", "Item1": null, "Name": "type2" } ]I am quite new to jq so this is probably not an optimal solution.
If you map the select onto the records array instead, the surrounding object is not removed. For example:
parse.jq
[ .data[] | { id : .id, Item1 : .metadata.item1, Name : .records | map(select(.type == "type2"))[0].name } ]Run it like this:
jq -f parse.jq file.jsonOutput:
[ { "id": "001", "Item1": 1, "Name": "type2" }, { "id": "002", "Item1": 1, "Name": null }, { "id": "003", "Item1": null, "Name": "type2" } ]更多推荐
发布评论