用 jq 解析嵌套的 json

Vin*_*ini 4 json jq

我正在解析嵌套的 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 
}
Run Code Online (Sandbox Code Playgroud)

从类 images=>classifiers=>classes:"class" & "score" 是我想保存在 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"]]'
Run Code Online (Sandbox Code Playgroud)

大多数情况下,错误是关于无法索引数组images。

任何提示?

Oli*_*ann 8

我必须说,我不太擅长jq,所以可能所有这些数组迭代都可能以某种方式简写,但这会产生您提到的值:

cat foo.json | jq ".[] | .images | .[] | .classifiers | .[] | .classes | .[] | .[]"
Run Code Online (Sandbox Code Playgroud)

如果你也想要钥匙,只需省略最后一个.[]。`

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

cat foo.json | jq ".images[].classifiers[].classes[] | [.class, .score] | @csv "
Run Code Online (Sandbox Code Playgroud)

  • `.images[].classifiers[].classes[]` 应该没问题,至少在 1.5 版本中(老实说,它可能已经发布了足够长的时间,如果人们不使用它,他们应该升级)。该过滤器的输出可以通过`[.class, .score] | 进行管道传输。@csv` 以生成所需的 CSV 输出。 (2认同)