【问题标题】:What is the best way to combine (merge) 2 JSONObjects?组合(合并)2个JSONObjects的最佳方法是什么?
【发布时间】:2013-10-24 12:33:33
【问题描述】:

合并(合并)两个JSONObjects 的最佳方法是什么?

JSONObject o1 = {
    "one": "1",
    "two": "2",
    "three": "3"
}
JSONObject o2 = {
        "four": "4",
        "five": "5",
        "six": "6"
    }

o1o2 的组合结果必须是

JSONObject result = {
        "one": "1",
        "two": "2",
        "three": "3",
        "four": "4",
        "five": "5",
        "six": "6"
    }

【问题讨论】:

  • 你指的是哪种语言?
  • 如果两个对象包含相同的键,你希望它做什么?
  • @TomHart,没有。两个对象中没有相同的键。
  • 使用 JSONObject keys() 获取对象中键的迭代器,并通过两个对象 while(iterator.hasNext()) 获取新对象 newObj.add(key, oldObj.get(key); 的所有值

标签: java android json


【解决方案1】:

我遇到了同样的问题:我找不到 putAll 方法(并且它没有在 official reference page 中列出)。

所以,我不知道这是否是最好的解决方案,但肯定效果很好:

//I assume that your two JSONObjects are o1 and o2
JSONObject mergedObj = new JSONObject();

Iterator i1 = o1.keys();
Iterator i2 = o2.keys();
String tmp_key;
while(i1.hasNext()) {
    tmp_key = (String) i1.next();
    mergedObj.put(tmp_key, o1.get(tmp_key));
}
while(i2.hasNext()) {
    tmp_key = (String) i2.next();
    mergedObj.put(tmp_key, o2.get(tmp_key));
}

现在,合并的 JSONObject 存储在mergedObj

【讨论】:

  • 感谢您的回答。我这与 cmets 中提出的@TomHart 相同。
  • 这种合并是浅层的,即嵌套对象被覆盖而不是合并
【解决方案2】:

json 对象要像这样合并到那个新的 json 对象中。

    JSONObject jObj = new JSONObject();
    jObj.put("one", "1");
    jObj.put("two", "2");
    JSONObject jObj2 = new JSONObject();
    jObj2.put("three", "3");
    jObj2.put("four", "4");


    JSONParser p = new JSONParser();
    net.minidev.json.JSONObject o1 = (net.minidev.json.JSONObject) p
                        .parse(jObj.toString());
    net.minidev.json.JSONObject o2 = (net.minidev.json.JSONObject) p
                        .parse(jObj2.toString());

    o1.merge(o2);

    Log.print(o1.toJSONString());

现在 o1 将是合并的 json 对象。 你会得到这样的输出::

{"three":"3","two":"2","four":"4","one":"1"}

请参考此链接并下载 smartjson 库..这里是链接http://code.google.com/p/json-smart/wiki/MergeSample

希望它会有所帮助。

【讨论】:

  • 我不相信这样做会得到 OP 中所需的输出
  • @Neurenor - 这样会给出错误的输出。见问题。
  • 感谢您的回答,但我不想在我的项目中包含用于此类小操作的第三方库。
  • 我用谷歌搜索并找到了这个东西。它更容易使用。也许你会为此实现代码,但他们已经实现了,如果它可以节省你的时间,使用库没有什么不好.
【解决方案3】:

这个怎么样:

            Iterator iterator = json2.keys();
            while(iterator.hasNext()){
                String key = iterator.next().toString();
                json1.put(key,map.optJSONObject(key));
            }

【讨论】:

  • 变量map的类型是什么
【解决方案4】:

合并 JsonObject(gson)-

JsonObject data = new JsonObject();
data = receivedJsoData.get("details").getAsJsonObject();

JsonObject data2 = new JsonObject();
data2 = receivedJsoData1.get("details").getAsJsonObject();

JsonObject mergedData = new JsonObject();

Set<Map.Entry<String, JsonElement>> entries = data1.entrySet();  //will return members of your object
for (Map.Entry<String, JsonElement> entry : entries) {
    mergedData.add(entry.getKey(), entry.getValue());
}
Set<Map.Entry<String, JsonElement>> entries1 = data2.entrySet();  //will return members of your object
for (Map.Entry<String, JsonElement> entry : entries1) {
    mergedData.add(entry.getKey(), entry.getValue());
}

【讨论】:

    【解决方案5】:

    试试这个..希望它有所帮助

    JSONObject result = new JSONObject();
    result.putAll(o1);
    result.putAll(O2);
    

    【讨论】:

    • 抱歉,我在 org.json.JSONObject Source 中找不到“putAll”方法
    • putAll 将替换结果 jsonobject 中的所有当前映射,这意味着,当 o1 对象被放入,然后 o2 对象也被放入时,o1 将被替换,只有 o2 将保留在结果对象中
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多