我需要根据第一个对象键合并两个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对象。将来它还会增长,如果可能,我需要处理。
如果您需要更多详细信息,请发表评论。感谢您的支持
答案 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
工具的创建者