Как выбрать элемент с JQ во вложенном JSON - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть такой ввод:

"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) для "Remaining Capacity%".

Мой лучший любительский, нопопытка поиска:

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

, но я получаю пустой результат.Любая помощь с этой вложенной непримиримостью будет очень цениться.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Ваша идея кажется правильной, но вы пропустили упоминание путей верхнего уровня после .data[], это должно было быть

jq --arg instance "Remaining Capacity % " \
     '.data[].batList[].dataDict[] | select(.name == $instance ).value' json
0 голосов
/ 02 апреля 2019

вот альтернативный подход с использованием утилиты Unix, основанной на дорожке пути jtc:

bash $ <file.json jtc -w'<Remaining Capacity % >[-1][value]'
99
bash $ 
0 голосов
/ 01 апреля 2019

Альтернативой ответу Иньяна является использование рецепта выбора содержимого, например:

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

Хотя не лучше в этом примере, это удобно запомнить, особенно если вам нужно найти набор значений, например, contains("Battery") вернет три результата.

...