нашел этот интересный вопрос и подумал, что найти решение с помощью утилиты 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