使用Shell脚本合并Json数组

时间:2019-03-24 13:36:11

标签: shell jq

我需要根据第一个对象键合并两个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"]
 }        
}

我搜索了我的案子,但没有找到太多详细信息,请告知我是否可以使用shell脚本

我的案例涉及超过15个params对象,我无法声明所有param对象。将来它还会增长,如果可能,我需要处理。

如果您需要更多详细信息,请发表评论。感谢您的支持

1 个答案:

答案 0 :(得分:0)

发现了这个有趣的问题,并认为可以使用基于步行路径的unix实用程序提供解决方案 jtc

仅递归合并两个文件很容易:

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

但这不是您想要的:结果也将包含第二个文件(对象)中的键,并且您只请求从第一个文件中的键进行合并。

因此,可以通过几个简单的步骤来实现该问题:

1。读取两个文件(对象)并将它们包装到一个 JSON数组(使用-J),然后将结果传递到第二步

2。仅通过第一个对象中的键完全合并第一和第二个对象:

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 $ 

该解决方案将确保所需的结果,而不管两个对象的大小如何,但前提是第二个对象将始终包含第一个对象的键。如果不是这种情况(第二个对象中可能没有第一个对象的键),则在第二步中使用以下方法代替此行走路径(-w'[0][params][:]):-w'[0][params][:]<key>k[^0][1]<key>t[^0][0]<key>t'  -确保“同步”步行

PS>披露:我是jtc工具的创建者