安卓:JSON定制合并

3
我是一名有用的助手,可以为您进行文本翻译。
我已经创建了两个类似以下的JSON:
第一个数组:
[
   {
      "id":255,
      "is_new":0,
      "is_checked":true,
      "name":"Towel Rack 650",
      "is_favourite":false
   },
   {
      "id":257,
      "is_new":0,
      "is_checked":true,
      "name":"Towel Rod 450",
      "is_favourite":false
   },
   {
      "id":259,
      "is_new":0,
      "is_checked":true,
      "name":"Napkin Ring - Round",
      "is_favourite":false
   }
]

第二个数组:

[
   {
      "id":258,
      "is_new":0,
      "is_checked":false,
      "name":"Towel Rod 650",
      "is_favourite":true
   },
   {
      "id":259,
      "is_new":0,
      "is_checked":false,
      "name":"Napkin Ring - Round",
      "is_favourite":true
   }
]

我需要合并两个数组,并且在最终数组中只保留重复的值。

我使用以下代码片段进行合并。

private JSONArray concatArray(JSONArray arr1, JSONArray arr2)
        throws JSONException {
    JSONArray result = new JSONArray();
    for (int i = 0; i < arr1.length(); i++) {
        result.put(arr1.get(i));
    }
    for (int i = 0; i < arr2.length(); i++) {
        result.put(arr2.get(i));
    }
    return result;
}

我正在收到以下内容:
[
   {
      "id":255,
      "is_new":0,
      "is_checked":true,
      "name":"Towel Rack 650",
      "is_favourite":false
   },
   {
      "id":257,
      "is_new":0,
      "is_checked":true,
      "name":"Towel Rod 450",
      "is_favourite":false
   },
   {
      "id":259,
      "is_new":0,
      "is_checked":true,
      "name":"Napkin Ring - Round",
      "is_favourite":false
   },
   {
      "id":258,
      "is_new":0,
      "is_checked":false,
      "name":"Towel Rod 650",
      "is_favourite":true
   },
   {
      "id":259,
      "is_new":0,
      "is_checked":false,
      "name":"Napkin Ring - Round",
      "is_favourite":true
   }
]

由于我得到了id 259 的重复值,而这些值的is_checkedis_favourite不同,我想要它们都是true,如下:

{
    "id":259,
    "is_new":0,
    "is_checked":true,
    "name":"Napkin Ring - Round",
    "is_favourite":true
}

我也尝试过使用 SparseArray 但没有成功。有没有其他方法可以做到这一点呢?
非常感谢您的帮助。

我同意。我不明白你什么时候想要保留重复项,什么时候不想要。 - Joaquin Iurchuk
我不想重复两次相同的值,我只需要一次。 - Pratik Butani
1
我想没有更简单的方法了。你必须自己编写代码。也许可以在concatArray()函数中,在第二个for循环中解析数组并检查现有的id,然后添加它。 - Seshu Vinay
你能修复一下 JSON 构建的问题吗?除非你不能更改它,否则这就是你需要修复的。 - meda
不,我可以在构建时修复它,因为我正在以不同的方式创建它。@meda - Pratik Butani
显示剩余5条评论
2个回答

0

好的,我已经为您编写了代码:

首先,准备对象:

        JSONArray arr1 = new JSONArray(),arr2 = new JSONArray(),result = new JSONArray();
        JSONObject jobj = new JSONObject();
        try {
            jobj.put("id", "255");
            jobj.put("is_new", 0);
            jobj.put("is_checked", true);
            jobj.put("name", "Towel Rack 650");
            jobj.put("is_favourite", false);
            arr1.put(jobj);
            jobj = new JSONObject();
            jobj.put("id", "257");
            jobj.put("is_new", 0);
            jobj.put("is_checked", true);
            jobj.put("name", "Towel Rod 450");
            jobj.put("is_favourite", false);
            arr1.put(jobj);
            jobj = new JSONObject();
            jobj.put("id", "259");
            jobj.put("is_new", 0);
            jobj.put("is_checked", true);
            jobj.put("name", "Napkin Ring - Round");
            jobj.put("is_favourite", false);
            arr1.put(jobj);

            jobj = new JSONObject();
            jobj.put("id", "258");
            jobj.put("is_new", 0);
            jobj.put("is_checked", false);
            jobj.put("name", "Towel Rod 650");
            jobj.put("is_favourite", true);
            arr2.put(jobj);
            jobj = new JSONObject();
            jobj.put("id", "259");
            jobj.put("is_new", 0);
            jobj.put("is_checked", false);
            jobj.put("name", "Napkin Ring - Round");
            jobj.put("is_favourite", true);
            arr2.put(jobj);

            result = concatArray(arr1, arr2);

        } catch (JSONException e) {
            e.printStackTrace();
        }

然后,这个方法:

private JSONArray concatArray(JSONArray arr1, JSONArray arr2)
            throws JSONException {
        JSONArray result = new JSONArray();
        JSONObject jobj1 = new JSONObject(),jobj2 = new JSONObject(),tmpobj = new JSONObject();
        Set<String> objectsList = new HashSet<String>();

        for (int i = 0; i < arr1.length(); i++) {
            if(objectsList.add(arr1.getJSONObject(i).getString("id"))){
                result.put(arr1.getJSONObject(i));
            }

        }
        for (int i = 0; i < arr2.length(); i++) {
            if(objectsList.add(arr2.getJSONObject(i).getString("id"))){
                result.put(arr2.getJSONObject(i));
            } else {
                jobj1 = arr2.getJSONObject(i);
                int index = 0;
                for(int j = 0; j < result.length(); j++){
                    if(result.getJSONObject(j).getString("id").equals(jobj1.getString("id"))){
                        jobj2 = result.getJSONObject(j);
                        index = j;
                    }
                }
                tmpobj.put("id", jobj2.getString("id"));
                tmpobj.put("is_new", jobj2.getInt("is_new"));
                if(jobj1.getBoolean("is_checked")||jobj2.getBoolean("is_checked")){
                    tmpobj.put("is_checked", true);
                } else {
                    tmpobj.put("is_checked", false);
                }
                tmpobj.put("name", jobj2.getString("name"));
                if(jobj1.getBoolean("is_favourite")||jobj2.getBoolean("is_favourite")){
                    tmpobj.put("is_favourite", true);
                } else {
                    tmpobj.put("is_favourite", false);
                }
                result.put(index, tmpobj);
            }
        }
        return result;
    }

0

你可以添加一个 SparseArray(键:id,值:JSONArray 中的每个 JSONObject)来保存你的 jsonobjects。每次获取一个 jsonobject 时,首先检查它的 id 是否已经存在于 SparseArray 中,如果不存在,则插入它。否则,你需要根据自己的逻辑决定是插入、更新还是忽略它。

最后,如果你想要返回一个 JSONArray 类型,那么将 SparseArray 的所有值添加到你的 JSONArray 结果中即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接