2016-08-18 5 views
2

У меня есть следующие JSONизменения JSON с помощью JQ в Баш

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : [ 
      "val1" 
      ], 
     "field2" : [ 
      "val2" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val3" 
      ], 
     "field2" : [ 
      "val4" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val5" 
      ], 
     "field2" : [ 
      "val6" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    } 
    ] 
} 

мне нужно изменить выше JSON на следующий с помощью JQ в Баш

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : "val1", 
     "field2" : "val2", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val3", 
     "field2" : "val4", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val5", 
     "field2" : "val6", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    } 
    ] 

} 

Здесь я столкнулся следующие вопросы :

Я попытался разобрать внутренний json с значениями тега и заменить «[''] на пробелы, однако, когда я пытаюсь поместить« значения »в переменную в виде списка, jq преуменьшает и затем показывая каждый новая строка как элемент массива.

Число внутренних jsons в массиве значений не является фиксированным.

Может кто-нибудь, пожалуйста, помогите мне с кадрированием оператора jq для запуска в bash, чтобы внести необходимые изменения.

+1

@fedorqui Thnx за указание, что из, исправил вопрос – vamsi

+0

Знаете ли вы, что это именно '.values ​​[]. Field1' и' .values ​​[]. Field2' вы хотите изменить, или это любой синглтонный список в любом месте, который должен быть свернут на одно значение? – chepner

+0

Да «field1, field2, name» фиксируются в каждом json. Но число jsons не фиксировано. – vamsi

ответ

1

Это должно Работа; Я не уверен, если есть способ реорганизовать задания на field1 и field2:

jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json 
+0

Другой вариант - создать объект с новыми значениями и слить его. Но я думаю, что это более уродливое и потенциально более разрушительное, чем назначения. –

+0

Основываясь только на названии, я думал, что 'foreach' может быть релевантным, но я не могу представить, как он работает. Это все, что я мог сделать, чтобы придумать что-то вроде 'jq '.values ​​[] | = (foreach [" field1 "," field2 "] как $ f (empty;. [$ F] =. [$ F] [ 0]; пустой)) 'tmp1.json', который по крайней мере соответствует; он не производит выход. – chepner

+0

В моей голове, как я вижу, это 'foreach', как' reduce', но с дополнительной частью экстракции. Поэтому в вашем примере в вашем комментарии вы инициализировались пустым значением и пытаетесь присвоить ему значения. Но пустой пуст, поэтому он не дает результатов для каждой итерации. Затем для части извлечения вы извлекли пустой, так что из него ничего не происходит. При таком подходе вы можете просто придерживаться 'reduce' (с небольшой корректировкой):' .values ​​[] | = уменьшить ("field1", "field2") как $ f (.;. [$ F] =. [ $ f] [0]) ' –

2

Сниппет ниже должен делать то, что вы хотите:

jq '{ 
    "name": .name, 
    "values": [ 
     { 
      "field1" : .values[0].field1[0], 
      "field2" : .values[0].field2[0], 
      "New_name": .values[0].name1 
     }, 
     { 
      "field1" : .values[1].field1[0], 
      "field2" : .values[1].field2[0], 
      "new_name" : .values[1].name1 
     }, 
     { 
      "field1" : .values[2].field1[0], 
      "field2" : .values[2].field2[0], 
      "new_name" : .values[2].name1 
     } 
    ] 
}' < /tmp/input.json 

EDIT

Поскольку количество объектов не фиксированы ниже фрагмент кода будет делать:

jq '{ 
     "name" : .name, 
     "values" : [ 
       .values[] as $in | 
       { 
         "field1" : $in.field1[0], 
         "field2" : $in.field2[0], 
         "new_name" : $in.name1 
       } 
     ] 

}' < /tmp/input.json 
+0

thnx для быстрого ответа. Но число внутренних jsons в массиве значений не является фиксированным. – vamsi

0

Вот еще одно решение.

.values |= map({ 
    field1: .field1[0], 
    field2: .field2[0], 
    new_name: .name1 
    }) 
Смежные вопросы