如何在嵌套JSON中选择具有jq的元素

如何在嵌套JSON中选择具有jq的元素,json,jq,Json,Jq,我的意见如下: "data": [{ "id": 111585, "name": "Inverter", "batList": [{ "name": "Battery1", "dataDict": [{ "key": "b1_1", "name": "Battery V.", "value": 57.63,

我的意见如下:

"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": "%"
            }]
        }]
    }],
我想从中提取“value”属性,即剩余容量的99%

我最好的业余但搜索得很好的尝试是

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

但是我得到了一个空的结果。如果您对这种嵌套的不妥协有任何帮助,我们将不胜感激。

您的想法似乎是正确的,但您没有提到.data[]之后的顶级路径,应该是

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

Inian回答的另一种方法是使用“选择包含”配方,例如:

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

虽然在本例中没有更好的方法,但是记住它非常方便,特别是当您需要查找一组值时,例如containsBattery将返回三个结果

工作!我一定试过你解决方案的每一个组合,除了正确的。我得到了jq:error,在我尝试batList[]等时,无法使用字符串索引数组。。谢谢你的及时帮助。