Java:将两个json对象与主键合并在一起

Java:将两个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

假设我在内存中有两个JSONObject数组,每个对象在两个数组中都有一个相似的键:

阵列1

[
  {
    "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(子键));
}
}
列表合并=条目。值();
这比两个嵌套循环更有效,而且还有改进的余地

编辑:参考外部文档和相关答案


Java还是JavaScript?(问“cuzjavajavascript”)Java。它在问题的标题中。哦,我知道,但第一个答案(现在看不到)让我很反感,因为它提供了JS代码,所以我想确保我不认为那个家伙读了问题或看到了问题上的标记-我看到他现在删除了它。有没有可能在第二个数组中找到第一个数组的键?(当然,除了
“id”
)我不确定我是否理解这里的代码-也许你可以详细说明一下。您正在对象中的键上创建一个for循环,但是对象调用“id”中只有一个键,因此您不能针对该键创建for循环。另外hashmap没有set方法…@Simon哎呀,这是一个语法错误,我刚刚修复了它,并添加了一行代码来说明如何从映射中获取合并的对象。代码基本上迭代两个列表中的所有对象,并基于
id
键将它们的属性合并到单个JSONObject
existing
。该对象存储在
映射中
,因此使用它的
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();