2015-07-28 2 views
0

У меня есть следующие JSON-встроенный документ:JQ - запрос альтернативы JSON структура

{ 
    "a": "Person", 
    "alternateName": [ 
    { 
     "alternateName": "1793 Diébolt" 
    }, 
    { 
     "alternateName": "XXX Diébolt" 
    } 
    ], 
    "uri": "http://500051893" 
    } 
    { 
    "a": "Person", 
    "alternateName": { 
     "alternateName": "A1-53167" 
    }, 
    "uri": "http://vocab.getty.edu/ulan/500116327" 
    } 

Я хочу, чтобы получить значения из всех alternateName ключей и выводить их в виде файла TSV.

я могу получить те, которые имеют только один alternateName-объект с:

jq -r "[ .uri, .alternateName.alternateName ] | join(\"\t\")" 

Но как я могу получить как: те, с только один alternateName-объект и те, где первый alternateName ключ словарь с alternateName ключами?

ответ

1

Вы действительно должны работать с данными, которые имеют одинаковую структуру. В противном случае вам остается иметь дело со странными угловыми случаями. alternateName должен быть массивом объектов или иным образом реплицировать корневой объект с каждым из объектов alternateName.

В любом случае, вот как вы можете иметь дело с различными типами. Используйте альтернативный оператор (//) вместе с некоторой фильтрацией для работы с различными случаями. Вы можете использовать фильтр arrays для обработки массивов и альтернативных предполагаемых объектов.

{ uri, alternateName: .alternateName | (arrays[].alternateName // .alternateName) } 
    | "\(.uri)\t\(.alternateName)" 
+1

данные не исходят от меня, поэтому я не могу изменить формат, но иметь дело с ним. Спасибо за ответ, я попробую сразу. – SnafuBernd

0

Вот решение, которое использует вспомогательную функцию для нормализации .alternateName значения.

def vals: 
    if (.|type) == "object" then .[] else . end 
;  

"\(.uri)\t\(.alternateName[] | vals)" 
Смежные вопросы