用jq解析嵌套的json

时间:2017-10-26 13:51:09

标签: 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 
}

来自class images => classifiers => classes:" class" &安培; "得分"是我想要保存在csv文件中的值。我已经找到了如何将结果保存在csv文件中。但我无法单独解析images。我可以获得custom_classesimage_processed

我正在使用jq-1.5

我尝试过的不同命令:

curl "Some address"| jq '.["images"]'
curl "Some address"| jq '.[.images]'
curl "Some address"| jq '.[.images["image"]]'

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

任何提示?

3 个答案:

答案 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: ..objectshas可能有效:

.. | objects | select(has("class")) | [.class,.score] | @csv

示例运行(假设data.json中的数据)

$ jq -Mr '.. | objects | select(has("class")) | [.class,.score] | @csv' data.json
"football",0.867376

Try it online at jqplay.org

以下是另一种使用pathsgetpath

的变体
getpath( paths(has("class")?) ) | [.class,.score] | @csv

Try it online at jqplay.org