用jq解析嵌套的json

用jq解析嵌套的json,json,jq,Json,Jq,我正在解析一个嵌套的json,以从json响应中获取特定的值。json响应如下所示: { "custom_classes": 2, "images": [ { "classifiers": [ { "classes": [ { "class": "football",

我正在解析一个嵌套的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 
}
从类图像=>classifiers=>classes:“class”和“score”是我想要保存在csv文件中的值。我已经找到了如何将结果保存到csv文件中。但是我无法单独解析
图像。我可以得到
自定义类
图像处理

我正在使用
jq-1.5

我尝试过的不同命令:

curl "Some address"| jq '.["images"]'
curl "Some address"| jq '.[.images]'
curl "Some address"| jq '.[.images["image"]]'
大多数情况下,错误是由于无法为数组
图像编制索引


有什么提示吗?

我必须说,我不太擅长
jq
,所以可能所有这些数组迭代都会在某种程度上人手不足,但这会产生您提到的值:

cat foo.json | jq ".[] | .images | .[] | .classifiers | .[] | .classes | .[] | .[]"
如果你也想要钥匙,只需省略最后一个
[]
`

编辑 正如@chepner在评论中指出的,这确实可以缩短为

cat foo.json | jq ".images[].classifiers[].classes[] | [.class, .score] | @csv "

jq获取准备好的csv记录的解决方案:

输出:

"football",0.867376

根据此过滤器使用的数据以及可能工作的数据:

.. | objects | select(has("class")) | [.class,.score] | @csv
示例运行(假设数据在
data.json
中)

这是另一个使用和的变体


模板回答:寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。很抱歉,我没有添加我尝试的命令。编辑
.images[].classifiers[].classes[]
应该很好,至少在1.5版中是这样(老实说,1.5版可能已经过时了,如果人们不使用它,他们应该升级)。该筛选器的输出可以通过管道通过
[.class、.score]|@csv
生成所需的csv输出。@切普纳:我不可能在单行中同时访问这两个变量吗<代码>cat foo.json | jq'.images[].classifiers[].classes[]{.score.class}'
??我试过不同的组合。我正在跟踪教程网站上的示例。@Vini,或许可以尝试以下操作:
cat foo.json | jq.[].[]..images[].分类器[].classes[].{foo:.score,bar:.class}'
,您需要提供在新构造的对象中使用的对象键。或者使用
[.score,.class]
将其作为数组。@OliverBumann:我找到了。我尝试了所有的可能性:)@Oliverbauman:它在最初的地方对“.[]”不起作用。来自chepner的命令也很有效。
.. | objects | select(has("class")) | [.class,.score] | @csv
$ jq -Mr '.. | objects | select(has("class")) | [.class,.score] | @csv' data.json
"football",0.867376
getpath( paths(has("class")?) ) | [.class,.score] | @csv