需要帮助在终端中使用 jq 解析 JSON 结构
Need help parsing JSON structure using jq in Terminal
我有以下格式的 JSON 代码,但我无法弄清楚如何使用 JQ 从列表中的对象内的嵌套字典中调用信息 - 如果这有意义的话。该列表是最高字典的整个值。这是结构示例:
{ "product" : [ { "A_key1" : "valueA1",
"A_key2" : "valueA2",
"A_key3" : {"keyA3x_nested" : "valueA3x_nested", "keyA3y_nested" : "valueA3y_nested"}
},
{ "B_key1" : "valueB1",
"B_key2" : "valueB2",
"B_key3" : {"keyB3x_nested" : "valueB3x_nested", "keyB3y_nested" : "valueB3y_nested"}
},
]
}
我想要做的是 select 只有一些来自层次结构中不同位置的项目,如下所示:
{ “产品”:{ “A_key1”:“valueA1”,“A_key3”:{“keyA3y_nested”:“valueA3y_nested”} “B_key1": "valueB1", "B_key3": {"keyB3y_nested": "valueB3y_nested"} } }
到目前为止,我可以在命令提示符下执行此操作:
卷曲 https://sample_api | jq'{产品:.产品[0]}'
^ returns “A” 的整个对象,其中包括 A 的所有 3 个键,但我如何才能 select 从层次结构的较低层有效地提取信息?
谢谢。
此代码应该适合您:
curl https://sample_api | \
jq -r '(.product[0] | .A_key1, .A_key3.keyA3y_nested),
(.product[1] | .B_key1, .B_key3.keyB3y_nested)'
希望这能达到您的预期:
#!/bin/bash
jq '. as $root | null '"$(jq -nr '
def spread_paths($array):
reduce $array[] as $element ([];
. + (if ($element|type) == "object"
then ($element | to_entries | map(.key + spread_paths(.value)[]) )
else [$element] end)
);
spread_paths([
{".product[0].": ["A_key1", "A_key3.keyA3y_nested"]},
{".product[1].": ["B_key1", "B_key3.keyB3y_nested"]}
])[] | "|\(.)=$root\(.)"
') | map_values(.|add)" input-file
我有以下格式的 JSON 代码,但我无法弄清楚如何使用 JQ 从列表中的对象内的嵌套字典中调用信息 - 如果这有意义的话。该列表是最高字典的整个值。这是结构示例:
{ "product" : [ { "A_key1" : "valueA1",
"A_key2" : "valueA2",
"A_key3" : {"keyA3x_nested" : "valueA3x_nested", "keyA3y_nested" : "valueA3y_nested"}
},
{ "B_key1" : "valueB1",
"B_key2" : "valueB2",
"B_key3" : {"keyB3x_nested" : "valueB3x_nested", "keyB3y_nested" : "valueB3y_nested"}
},
]
}
我想要做的是 select 只有一些来自层次结构中不同位置的项目,如下所示:
{ “产品”:{ “A_key1”:“valueA1”,“A_key3”:{“keyA3y_nested”:“valueA3y_nested”} “B_key1": "valueB1", "B_key3": {"keyB3y_nested": "valueB3y_nested"} } }
到目前为止,我可以在命令提示符下执行此操作: 卷曲 https://sample_api | jq'{产品:.产品[0]}'
^ returns “A” 的整个对象,其中包括 A 的所有 3 个键,但我如何才能 select 从层次结构的较低层有效地提取信息?
谢谢。
此代码应该适合您:
curl https://sample_api | \
jq -r '(.product[0] | .A_key1, .A_key3.keyA3y_nested),
(.product[1] | .B_key1, .B_key3.keyB3y_nested)'
希望这能达到您的预期:
#!/bin/bash
jq '. as $root | null '"$(jq -nr '
def spread_paths($array):
reduce $array[] as $element ([];
. + (if ($element|type) == "object"
then ($element | to_entries | map(.key + spread_paths(.value)[]) )
else [$element] end)
);
spread_paths([
{".product[0].": ["A_key1", "A_key3.keyA3y_nested"]},
{".product[1].": ["B_key1", "B_key3.keyB3y_nested"]}
])[] | "|\(.)=$root\(.)"
') | map_values(.|add)" input-file