Свести массив пар ключ-значение в объект - PullRequest
1 голос
/ 21 июня 2019

У меня очень мало опыта работы с JSON и jq, и я пытаюсь переформатировать мои объекты JSON.Каждый объект содержит пару пар ключ / значение и массив объектов.Я пытаюсь реструктурировать каждый объект так, чтобы это был просто список пар ключ / значение (т.е. извлечь объекты из массива).

[
   {
      "key1":"value1",
      "key2":"value2",
      "key 3":[
         {
            "a":"key_to_be_extracted_1",
            "v":"value_to_be_extracted_1"
         },
         {
            "a":"key_to_be_extracted_2",
            "v":"value_to_be_extracted_2"
         }
      ]
   },
   {
      "key1":"value1",
      "key2":"value2",
      "key 3":[
         {
            "a":"key_to_be_extracted_1",
            "v":"value_to_be_extracted_1"
         },
         {
            "a":"key_to_be_extracted_2",
            "v":"value_to_be_extracted_2"
         }
      ]
   }
]

То, что я пытаюсь получить, это:

[
   {
      "key1":"value1",
      "key2":"value2",
      "key_to_be_extracted_1":"value_to_be_extracted_1",
      "key_to_be_extracted_2":"value_to_be_extracted_2"
   },
   {
      "key1":"value1",
      "key2":"value2",
      "key_to_be_extracted_1":"value_to_be_extracted_1",
      "key_to_be_extracted_2":"value_to_be_extracted_2"
   }
]

Любая помощь с этим была бы потрясающей !!

Ответы [ 2 ]

1 голос
/ 21 июня 2019

jq имеет функцию from_entries, которая ожидает массив из {key, value} объектов и создает объект. Таким образом, вы можете преобразовать значение «ключ 3» в такой массив и создать объект, подобный следующему:

."key 3" | map({key: .a, value: .v} | from_entries

Соединяя это с картой, которая просто копирует два других ключа:

map({key1, key2} + (."key 3" | map({key: .a, value: .v}) | from_entries))

0 голосов
/ 21 июня 2019

Если вы хотите избежать указания ключей для сохранения, вы можете использовать:

map( .
     + (."key 3" | map( {(.a): .v} ) | add )
     | del(."key 3") )

То есть добавьте новые пары ключ-значение, а затем удалите «ключ 3». Обратите также внимание на то, что здесь использовалось add вместо from_entries, что делает решение более кратким и, возможно, более простым.

...