jq transform - объекты дочернего массива json в строку с разделителями - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу преобразовать следующий вход с помощью jq

{
   "root":[
      {
         "field1":"field1value1",
         "field2":"field2value2",
         "field3Array":[
            {
               "prop1":"prop1_value1"
            }
         ]
      },
      {
         "field1":"field1value3",
         "field2":"field2value4",
         "field3Array":[
            {
               "prop1":"prop1_value3"
            },
            {
               "prop1":"prop1_value4"
            }
         ]
      }
   ]
}

Вывод должен быть:

[
  {
    "field1": "field1value1",
    "field2": "field2value2",
    "field3Array": "prop1_value1"
  },
  {
    "field1": "field1value3",
    "field2": "field2value4",
    "field3Array": "prop1_value3,prop1_value4"
  }
]

Пока я использую этот фильтр jq -> "[.root [] |{field1, field2, field3Array: .field3Array []. prop1}] "но не знаю, как" соединить "свойство массива" prop1 "со строкой, разделенной запятой ->" prop1_value3, prop1_value4 "

https://jqplay.org/s/CR8mGBX8Dz

1 Ответ

0 голосов
/ 03 декабря 2018

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

.root | map({field1, field2, field3Array: .field3Array | map(.prop1) | join(",")})

Вы можете попробовать здесь .


Это может быть несколько упрощено в следующем, где мы обновляем .field3Array на месте вместо воссоздания целого объекта:

.root | map(.field3Array |= (map(.prop1) | join(",")))

Вы можете попробовать здесь .


Если вы не знакомы с функцией map, сработало бы и следующее:

[.root[] | {field1, field2, field3Array: [ .field3Array[] | .prop1 ] | join(",")}]

Вы можете попробовать здесь .

...