Объединить массив Json с помощью сценария оболочки - PullRequest
1 голос
/ 24 марта 2019

Мне нужно объединить два объекта JSON на основе первых ключей объекта

object1 = {
 "params" : {
    "type": ["type1", "type2"],
    "requeststate": []
 }        
}

object2 = {
 "params" : {
    "type": ["type2", "type3", "type4"],
    "requeststate": ["Original", "Revised" ],
    "responsestate": ["Approved" ]
 }        
}

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

mergedobject = {
 "params" : {
    "type": ["type1", "type2", "type3", "type4"],
    "requeststate": ["Original", "Revised"]
 }        
}

Я искал свой случай и не нашел много деталей. Пожалуйста, дайте мне знать, возможно ли это сделать с помощью сценария оболочки

Мой случай связан с более чем 15 объектами params, и я не могу объявить весь объект param.Также это может вырасти в будущем, и мне нужно справиться с этим, если это возможно.

Пожалуйста, прокомментируйте, если вам нужно больше деталей.Спасибо за вашу поддержку

1 Ответ

0 голосов
/ 12 мая 2019

нашел этот интересный вопрос и подумал, что найти решение с помощью утилиты Unix на основе обходного пути jtc:

просто рекурсивно объединить 2 файла очень просто:

bash $ <file1.json jtc -mi file2.json 

но это не то, что вам нужно: результат будет также содержать ключи из второго файла (объекта), и вы запросите объединение по ключам только из первого .

Итак, этот запрос выполним за несколько простых шагов:

1.прочитайте оба файла (объекта) и оберните их в один массив JSON (uing -J), затем передайте результат на второй шаг

2.объединить первый и второй объекты точно по ключам только от 1-го объекта:

bash $ cat file1.json file2.json | jtc -J | jtc -w'[0][params][:]' -mi'[0][params][:]<key>k[^0][1]<key>t'
[
   {
      "params": {
         "requeststate": [
            "Original",
            "Revised"
         ],
         "type": [
            "type1",
            "type2",
            "type2",
            "type3",
            "type4"
         ]
      }
   },
   {
      "params": {
         "requeststate": [
            "Original",
            "Revised"
         ],
         "responsestate": [
            "Approved"
         ],
         "type": [
            "type2",
            "type3",
            "type4"
         ]
      }
   }
]
bash $ 

, поскольку вы видите, что первый объект - это то, что вам нужно (объединить оба объекта только по ключам от первого).

Если вы хотите избавиться от дублирования (в результате слияния) во всех элементах ниже [params], тогда передайте результат на следующий шаг: удалите дубликаты и, наконец, отобразите только первый объект:

bash $ cat file1.json file2.json | jtc -J | jtc -w'[0][params][:]' -mi'[0][params][:]<key>k[^0][1]<key>t' | jtc -w'[0][params][:]<.>Q:' -p | jtc -w'[0]'
{
   "params": {
      "requeststate": [
         "Original",
         "Revised"
      ],
      "type": [
         "type1",
         "type2",
         "type3",
         "type4"
      ]
   }
}
bash $ 

это решение гарантирует требуемый результат независимо от размеров обоих объектов, но предполагается, что второй объект всегда будет содержать ключ от первого объекта.Если это не так (а ключи от 1-го объекта могут отсутствовать во втором), тогда вместо этого пути (-w'[0][params][:]) на втором шаге используйте следующий: -w'[0][params][:]<key>k[^0][1]<key>t[^0][0]<key>t' - это обеспечит "синхронные" прогулки

PS> Раскрытие информации: я создатель инструмента jtc

...