2015-11-07 3 views
3

Я создал два JSON как следующий,Android: JSON Пользовательские Merge

Первый массив:

[ 
    { 
     "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 
    } 
] 

В том, что я должен объединить оба массива, а также сохранить повторяющиеся значения один раз в конечном массиве.

Я использовал следующие snippet для слияния.

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 , который имеет различные значения is_checked и is_favourite, которые я хочу true значение для обоих, как:

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

Я также пробовал SparseArray, но не удалось. Есть какой-либо способ сделать это?

Ваша помощь будет оценена.

+0

Вы пытаетесь избавиться от дубликата JSON (с id = 259) или вы пытаетесь изменить его значение is_checked? (Извините, я не совсем понял, на что вы нацеливаетесь) –

+0

Согласен. Я не понимаю, когда вы хотите копировать дубликаты, а когда нет –

+0

Я не хочу дублировать значения два раза, мне нужно это только один раз. –

ответ

0

Вы можете добавить SparseArray (ключ: идентификатор, значение: каждый JSONObject в вашем JSONArray), чтобы сохранить jsonobjects, каждый получит JSONObject, первый чек, если его идентификатор существует в разрежённом массиве, если нет, то вставить it.or вас будет делать вашу логику, чтобы решить, следует ли ее вставлять или обновлять или игнорировать.

Наконец, если вы хотите получить JSONArray как возвращаемый тип, добавьте все значения SparseArray в результат JSONArray.

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; 
    } 
Смежные вопросы