Java:将两个json对象与主键合并在一起
假设我在内存中有两个JSONObject数组,每个对象在两个数组中都有一个相似的键: 阵列1Java:将两个json对象与主键合并在一起,java,arrays,json,primary-key,Java,Arrays,Json,Primary Key,假设我在内存中有两个JSONObject数组,每个对象在两个数组中都有一个相似的键: 阵列1 [ { "name": "Big Melons Co.", "location": "Inner City Dubai" "id": "1A" }, { "name": "Pear Flavored Juices Ltd", "location": "Seychelles" "id": "2A" }, { "name": "Sq
[
{
"name": "Big Melons Co.",
"location": "Inner City Dubai"
"id": "1A"
},
{
"name": "Pear Flavored Juices Ltd",
"location": "Seychelles"
"id": "2A"
},
{
"name": "Squeeze My Lemons LLC",
"location": "UK"
"id": "3A"
}, {other JSON Objects...} ]
阵列2
[
{
"acceptsCard": "true"
"id": "1A"
},
{
"acceptsCard": "false"
"id": "2A"
},
{
"acceptsCard": "false"
"id": "3A"
}, {other JSON Objects...} ]
现在,我想根据主键“id”将两个数组合并在一起,使它们在我的服务器端成为一个数组,然后将结果发送回我的前端-生成的对象数组列表应该如下所示:
合并数组(结果)
我怎样才能有效地做到这一点
我可以想出一种效率极低的方法来实现这一点(我害怕实现它)——我会循环遍历数组1或数组2中的每个项,并对“id”字段中的字符串使用equal()方法来查看这两个是否匹配。如果它们匹配,我将创建一个新的JSONObject来包含数组1和数组2的字段。我的Java有点生疏,但我会使用映射
List<JSONObject> objectsA = ... ;
List<JSONObject> objectsB = ... ;
Map entries = new HashMap<String, JSONObject>();
List<JSONObject> allObjects = new ArrayList<JSONObject>();
allObjects.addAll(objectsA);
allObjects.addAll(objectsB);
for (JSONObject obj: allObjects) {
String key = obj.getString("id");
JSONObject existing = entries.get(key);
if (existing == null) {
existing = new JSONObject();
entries.put(key, existing);
}
for (String subKey : obj.keys()) {
existing.put(subKey, obj.get(subKey));
}
}
List<JSONObject> merged = entries.values();
List objectsA=;
列出objectsB=;
Map entries=newhashmap();
List allObjects=new ArrayList();
addAll(objectsA);
allObjects.addAll(objectsB);
for(JSONObject对象:AllObject){
String key=obj.getString(“id”);
JSONObject existing=entries.get(key);
if(现有==null){
现有=新的JSONObject();
条目。放置(键,现有);
}
for(字符串子键:obj.keys()){
existing.put(子键,obj.get(子键));
}
}
列表合并=条目。值();
这比两个嵌套循环更有效,而且还有改进的余地
编辑:参考外部文档和相关答案
“id”
)我不确定我是否理解这里的代码-也许你可以详细说明一下。您正在对象中的键上创建一个for循环,但是对象调用“id”中只有一个键,因此您不能针对该键创建for循环。另外hashmap没有set方法…@Simon哎呀,这是一个语法错误,我刚刚修复了它,并添加了一行代码来说明如何从映射中获取合并的对象。代码基本上迭代两个列表中的所有对象,并基于id
键将它们的属性合并到单个JSONObjectexisting
。该对象存储在映射中
,因此使用它的id
检索它很快。这有意义吗?@Simon关于for循环,不管对象是否有0个或多个键,JSONObject.keys()
函数将在它们的列表上返回一个迭代器(该列表可能恰好是空的或只包含一项)。正如我所说,我已经有一段时间没有用Java编程了,实际上您可能需要修改该循环以显式地使用返回的迭代器对象,不确定是否可以对每个对象使用。我需要考虑一下这一点,但您在那里所做的非常有意义。我需要先测试一下,然后再给你回复。谢谢-它正在工作,但我意识到我可能需要退一步,在pojo级别进行合并。我很快会发布一个新问题。
List<JSONObject> objectsA = ... ;
List<JSONObject> objectsB = ... ;
Map entries = new HashMap<String, JSONObject>();
List<JSONObject> allObjects = new ArrayList<JSONObject>();
allObjects.addAll(objectsA);
allObjects.addAll(objectsB);
for (JSONObject obj: allObjects) {
String key = obj.getString("id");
JSONObject existing = entries.get(key);
if (existing == null) {
existing = new JSONObject();
entries.put(key, existing);
}
for (String subKey : obj.keys()) {
existing.put(subKey, obj.get(subKey));
}
}
List<JSONObject> merged = entries.values();