我正在解析嵌套的json以从json响应中获取特定值。 json响应如下:
{
"custom_classes": 2,
"images":
[
{
"classifiers":
[
{
"classes":
[
{
"class": "football",
"score": 0.867376
}
],
"classifier_id": "players_367677167",
"name": "players"
}
],
"image": "1496A400EDC351FD.jpg"
}
],
"images_processed": 1
}
来自class images => classifiers => classes:" class" &安培; "得分"是我想要保存在csv文件中的值。我已经找到了如何将结果保存在csv文件中。但我无法单独解析images
。我可以获得custom_classes
和image_processed
。
我正在使用jq-1.5
。
我尝试过的不同命令:
curl "Some address"| jq '.["images"]'
curl "Some address"| jq '.[.images]'
curl "Some address"| jq '.[.images["image"]]'
大多数情况下,错误是无法索引数组images
。
任何提示?
答案 0 :(得分:3)
我必须说,我对jq
并不十分擅长,所以可能所有这些数组迭代都会以某种方式缩短,但这会产生你提到的值:
cat foo.json | jq ".[] | .images | .[] | .classifiers | .[] | .classes | .[] | .[]"
如果你想要按键,也可以省略最后.[]
。
修改强> 正如@chepner在评论中指出的那样,这确实可以缩短为
cat foo.json | jq ".images[].classifiers[].classes[] | [.class, .score] | @csv "
答案 1 :(得分:1)
jq 解决方案,以获取准备好的 csv 记录:
jq -r '.images[0].classifiers[0].classes[0] | [.class, .score] | @csv' input.json
输出:
"football",0.867376
答案 2 :(得分:0)
根据数据,此过滤器使用Recursive Descent: ..,objects和has可能有效:
.. | objects | select(has("class")) | [.class,.score] | @csv
示例运行(假设data.json
中的数据)
$ jq -Mr '.. | objects | select(has("class")) | [.class,.score] | @csv' data.json
"football",0.867376
的变体
getpath( paths(has("class")?) ) | [.class,.score] | @csv