我有两个 JSON 字符串,它们本质上是 JSONObject 的数组。这两个 JSON 字符串具有以下结构和键:
JSON-1:
[
{
"title": "ABC",
"edition": 7,
"year": 2011
},
{
"title": "DEF",
"edition": 2,
"year": 2012
},
{
"title": "XYZ",
"edition": 3,
"year": 2013
}
]
并且,JSON-2:
[
{
"title": "ABC",
"price": "20"
},
{
"title": "DEF",
"price": "20"
},
{
"title": "XYZ",
"price": "20"
}
]
这两个 JSON 都有一个公共键
"title"
基于此我想合并这两个 JSON,要么将 JSON-2 值合并到 JSON-1 中,要么使用合并结果创建一个 JSON 对象。
合并结果应如下所示:
[
{
"title": "ABC",
"edition": 7,
"year": 2011,
"price": "20"
},
{
"title": "DEF",
"edition": 2,
"year": 2012
"price": "20"
},
{
"title": "XYZ",
"edition": 3,
"year": 2013
"price": "20"
}
]
如何通过最少的循环和最少的对象创建来实现这一点?我也无法使用实体/模型类。我们的想法是在不创建任何模型类的情况下完成此操作。
注意:我无法使用 Gson,因为我没有获得使用它的批准。
我尝试使用
List<JSONObject> listObj = objectMapper.readValue(jsonOneString, new TypeReference<List<JSONObject>>(){});
,
但我收到了未知属性异常。
我尝试了
JsonNode node = objectMapper.readTree(jsonOneString);
,但我无法继续使用这种方法。
我知道我在这里所做的事情效率非常低,因此寻找不使用实体类、最少新对象创建和最少循环的方法。请指教。
更新:我更新了以下代码并稍加修改:
if (json1elem.get("title")!=null
&& json2elem.get("title")!=null
&& json1elem.get("title").equals(json2elem.get("title"))) {
//
}
JsonNode json1 = objectMapper.readTree(jsonOneString);
JsonNode json2 = objectMapper.readTree(jsonTwoString);
for (JsonNode json1elem : json1) {
for (JsonNode json2elem : json2) {
if (json1elem.get("title").equals(json2elem.get("title"))) {
((ObjectNode) json1elem).setAll((ObjectNode) json2elem);
break;
}
}
}
System.out.println(json1.toPrettyString());
public static JSONObject deepMerge(JSONObject source, JSONObject target) throws JSONException {
Iterator it = source.keys();
while (it.hasNext()) {
String key = (String) it.next();
Object value = source.get(key);
if (!target.has(key)) {
target.put(key, value);
} else {
if (value instanceof JSONArray) {
JSONArray valueArry = (JSONArray) value;
for (int i = 0; i < valueArry.length(); i++) {
if (valueArry.get(i) instanceof JSONObject) {
JSONObject jsonObj = (JSONObject) valueArry.get(i);
JSONObject valueJson1 = (JSONObject) jsonObj;
JSONArray targetArray = target.getJSONArray(key);
deepMerge(valueJson1, targetArray.getJSONObject(i));
}
}
} else if (value instanceof JSONObject) {
JSONObject valueJson = (JSONObject) value;
deepMerge(valueJson, target.getJSONObject(key));
} else {
target.put(key, value);
}
}
}
return target;
}