Java:将两个json对象与主键

时间:2015-09-29 17:47:25

标签: 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": "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"的主键将两个数组合并在一起。所以他们在我的服务器端成为一个,然后将结果发送回我的前端 - 由此产生的对象的arraylist应该是这样的:

合并阵列(结果)

  [
      {
        "name": "Great Juice Co.",
        "location": "Inner City Dubai"
        "acceptsCard": "true"
        "id": "1A"
      },
      {
        "name": "Pear Flavored Juices Ltd",
        "location": "Seychelles"
        "acceptsCard": "false"
        "id": "2A"
      },
      {
        "name": "Squeeze My Lemons LLC",
        "location": "UK"
        "acceptsCard": "false"
        "id": "3A"
      }, {other JSON Objects...} ]

我怎样才能有效地做到这一点?

我可以想到一种非常低效的方法(我实现这一点) - 我会遍历数组1或2中的每个项目,并对&中的字符串使用equal()方法#34; ID"字段,看看两个匹配。如果匹配,我会创建一个新的JSONObject来包含数组1和2中的字段。

1 个答案:

答案 0 :(得分:3)

我的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();

这比两个嵌套循环更有效,但仍有改进的余地。

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