2015-11-10 4 views
2

у меня есть некоторые JSON данные, что выглядит как:JQ: Получение двух уровней ключей

{ 
    "p": { 
    "d": { 
     "a" : { 
     "r": "foo", 
     "g": 1 
     }, 
     "b": { 
     "r": "bar", 
     "g": 2 
     } 
    }, 
    "c": { 
     "e": { 
     "r": "baz", 
     "g": 1 
     } 
    }, 
    ... 
    } 
} 

Я хочу что-то вроде:

{ 
    "d": [ 
    "a", 
    "b" 
    ], 
    "c": [ 
    "e" 
    ] 
} 

я могу получить список ключей на первом уровне при «p» с jq '.p|keys', а структура и клавиши на втором уровне - jq '.p|map(.|keys)', но я не могу понять, как его объединить.

ответ

5

Использование map_values вместо map для отображения значений объекта JSON, сохраняя ключи:

jq '.p | map_values(keys)' 

На JQ версии ниже 1.5, map_values не определен: вместо этого, вы можете использовать []|=:

jq '.p | . []|= keys' 
+0

По-видимому, «map_values» не существует в версии (1.4). У меня здесь. – Henrik

+2

Попробуйте 'jq '.p | , [] | = keys'' –

+0

Это делает именно то, что я хочу. Если вы включите его в ответ, я приму его. – Henrik

1

Вот решение, которое использует уменьшают и setpath

.p 
| reduce keys[] as $k (
    . 
    ; setpath([$k]; .[$k] | keys) 
)