如何在嵌套JSON中使用jq选择元素

时间:2019-04-01 03:59:45

标签: json jq

我这样输入:

"data": [{
        "id": 111585,
        "name": "Inverter",
        "batList": [{
            "name": "Battery1",
            "dataDict": [{
                "key": "b1_1",
                "name": "Battery V.",
                "value": 57.63,
                "unit": "V"
            }, {
                "key": "b1_2",
                "name": "Battery I.",
                "value": -0.10,
                "unit": "A"
            }, {
                "key": "b1_3",
                "name": "Battery P.",
                "value": -6,
                "unit": "W"
            }, {
                "key": "b1_4",
                "name": "Inner T.",
                "value": 25,
                "unit": "℃"
            }, {
                "key": "b1_5",
                "name": "Remaining Capacity % ",
                "value": 99,
                "unit": "%"
            }]
        }]
    }],

我要从中提取“剩余容量%”的“值”属性(即99)。

我最好的业余爱好,但搜寻得很好的尝试是

jq --arg instance "Remaining Capacity % " '.data | .[] | select(.name == $instance) | .value')

但是我得到的结果是空的。对于这种嵌套的不妥协的任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

您的想法似乎正确,但是您错过了2011-09-21 08:21:22之后的顶级路径,应该是

.data[]

答案 1 :(得分:0)

Inian答案的另一种选择是使用包含选择内容的配方,例如:

jq -r '.[].batList[].dataDict[] | select(.name|contains("Remaining")).value' file

虽然本例中没有更好的方法,但要记住这一点很方便,尤其是在需要查找一堆值(例如contains("Battery")将返回三个结果。

答案 2 :(得分:0)

这是使用基于步行路径的Unix实用程序 jtc 的另一种方法:

bash $ <file.json jtc -w'<Remaining Capacity % >[-1][value]'
99
bash $