java json 合并

发布于 2022-09-05 10:49:45 字数 1824 浏览 21 评论 0

现有两段json
第一段

{ "sheets": {
        "Sheet1": {
            "name": "Sheet1",
            "data": {
                "dataTable": {
                    "0": {
                        "0": {
                            "value": 1,
                            "style": {
                                "autoFormatter": {}
                            }
                        }
                    }
                }
            }
        }
    }
}

第二段

{
    "sheets":{
        "Sheet1":{
            "name":"Sheet1",
            "activeRow":1,
            "data":{
                "dataTable":{
                    "0":{
                        "0":{
                            "value":11,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    },
                    "1":{
                        "0":{
                            "value":2,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    }
                }
            }
        },
        "Sheet2":{
            "name":"Sheet2",
            "activeRow":2,
            "data":{
                "dataTable":{
                    "0":{
                        "0":{
                            "value":1,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

在第一段的基础上把第二段合并进去,生成新的json,发生变化的更行,没有的增加,有什么好办法吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

悲欢浪云 2022-09-12 10:49:46

首先,你应该把后端骂一顿,怎么返回这么垃圾的JSON结构,多余的嵌套,无用的命名,还有连JSONArray都不会用?

这个要解析只能遍历并合并同名对象或添加不同对象

Set<String> = obj2.keySet();
JSONObject child2;
JSONObject child1;
for(String key : set) {
  child2 = obj2.getJSONObject(key);
  child1 = obj1.getJSONObject(key);
  if (child1 == null) {
     //第二段内出现在第一段内不存在的JSONObject就用put添加
     obj1.put(key, child2);
  } else {
     //第二段内出现在第一段内存在的JSONObject就用putAll合并
     child1.putAll(child2);
  }
}

其实这样还不够,只能合并一层,还得通过递归来实现任意层级的合并,将以上代码段放到

JSONObject combine(JSONObject obj1, JSONObject obj2) {
  if (obj2 == null || obj2.isEmpty()) {
    return obj1;
  }
  if (obj1 == null) {
    obj1 = new JSONObject();
  }
  
  //TODO 这里放以上代码段

  return obj1;
}

函数中,然后在 child1 == null 成立时,

obj1.put(key, child2); 

改为

obj1.put(key, combine(child1, child2)); 

其实还不够,因为不只有JSONObject,所以

child2 = obj2.getJSONObject(key);

要改为

Object o = obj2.get(key);
if (o instanceof JSONObject == false) {
  continue;
}
child2 = (JSONObject) o;

其它同样。

为了直观,有些地方没判空,建议在写完整体逻辑后加上类似以下这种

if (obj2 == null) {
  return null;
}

PS:纯手打,某些单词可能拼错,勿怪。
如果你受够了垃圾后端,可以看看这个
https://github.com/TommyLemon...

无风消散 2022-09-12 10:49:46

把两个json转对象,对象再合并,然后再将合并后的对象转json

煮茶煮酒煮时光 2022-09-12 10:49:46

感谢 @TommyLemon 的回答,最终参考了json合并

@sunnyzhang 的第二个回答。实现方法如下:

public JSONObject deepMerge(JSONObject source, JSONObject target) {
        Set<String> set = source.keySet();
        for (String key: set) {
            Object value = source.get(key);
            if (!target.containsKey(key)) {
                target.put(key, value);
            } else {
                if (value instanceof JSONObject) {
                    JSONObject valueJson = (JSONObject)value;
                        deepMerge(valueJson, target.getJSONObject(key));
                } else {
                    target.put(key, value);
                }
            }
        }
        return target;
    }
柳絮泡泡 2022-09-12 10:49:46

没时间写java代码,写了段javascript,可以参考一下。

var oldData = { "sheets": {
        "Sheet1": {
            "name": "Sheet1",
            "data": {
                "dataTable": {
                    "0": {
                        "0": {
                            "value": 1,
                            "style": {
                                "autoFormatter": {}
                            }
                        }
                    }
                }
            }
        }
    }
};

var newData = {
    "sheets":{
        "Sheet1":{
            "name":"Sheet1",
            "activeRow":1,
            "data":{
                "dataTable":{
                    "0":{
                        "0":{
                            "value":11,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    },
                    "1":{
                        "0":{
                            "value":2,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    }
                }
            }
        },
        "Sheet2":{
            "name":"Sheet2",
            "activeRow":2,
            "data":{
                "dataTable":{
                    "0":{
                        "0":{
                            "value":1,
                            "style":{
                                "autoFormatter":{

                                }
                            }
                        }
                    }
                }
            }
        }
    }
};
function update(newData, oldData){
    for(var key in newData){
        if(oldData[key] && oldData[key] instanceof Object){//如果还是嵌套
          update(newData[key],oldData[key]);
        }else if(!oldData[key] || oldData[key] != newData[key]){
          oldData[key] = newData[key]
        }
    }
}
update(newData, oldData);
console.log(oldData);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文