Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Как наилучшим образом “смержить” два JSONObject?

#android #java #json


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

В результате слияния o1 и o2 должны получить:
JSONObject result = {
        "one": "1",
        "two": "2",
        "three": "3",
        "four": "4",
        "five": "5",
        "six": "6"
    }

Один из вариантов - использвать иторатор по keys, и пока hasNext - добавлять поле
по ключу в новый объект.
Ищу более красивый способ.
Note - Ключи в o1 и o2 повторяться не могут.    


Ответы

Ответ 1



Нашел вот такое решение: JSONObject jsonObj = new JSONObject(); jsonObj.put("name", "Sriram"); jsonObj.put("age", 2); jsonObj.put("hobby", "painting"); JSONObject jsonObj2 = new JSONObject(); jsonObj2.put("hobby", "Singing"); jsonObj2.put("dob", new Date(110, 4, 6)); jsonObj.putAll(jsonObj2); System.out.println(jsonObj); На выходе: {"dob":Thu May 06 00:00:00 IST 2010,"age":2,"name":"Sriram","hobby":"Singing"}

Ответ 2



Конвертируем JSON-объект в строку: String str1 = o1.toString(); Находим последнюю фигурную скобку в строке и заменяем её на запятую: int index1 = str1.lastIndexOf("}"); str1 = new StringBuilder(str1).replace(index1, index1+1, ",").toString(); Аналогично для второго объекта, только заменяем "{" на предыдущюю строку: String str2 = o2.toString(); int index2 = str1.indexOf("{"); str2 = new StringBuilder(str2).replace(index2, index2+1, str1).toString(); Конвертируем обратно в JSON-объект: JSONObject result = new JSONObject(str2); Но это явно не наилучший способ.

Ответ 3



Я пришел к тому, что наилучшим решением будет использования иторатора jsonObject.keys() и ручной сборки результурующего объекта. public JSONObject mergeJsonObjects(JSONObject o1, JSONObject o2) { JSONObject result = new JSONObject(); Iterator i1 = o1.keys(); Iterator i2 = o2.keys(); String tmp_key; while (i1.hasNext()) { tmp_key = (String) i1.next(); try { result.put(tmp_key, o1.get(tmp_key)); }catch (JSONException ignored){} } while (i2.hasNext()) { tmp_key = (String) i2.next(); try { result.put(tmp_key, o2.get(tmp_key)); }catch (JSONException ignored){} } return result; } upd: public JSONObject mergeJsonObjects(ArrayList jsonObjects) { JSONObject result = new JSONObject(); String tmp_key; for (JSONObject jsonObject: jsonObjects){ Iterator iterator = jsonObject.keys(); while (iterator.hasNext()) { tmp_key = (String) iterator.next(); try { result.put(tmp_key, jsonObject.get(tmp_key)); }catch (JSONException ignored){} } } return result; }

Ответ 4



Почему бы и нет. Пишется простейшая функция: public JSONObject sliv (JSONObject name1, JSONObject name2 ) throws JSONException { String str1 = name1.toString(); int index1 = str1.lastIndexOf("}"); str1 = new StringBuilder(str1).replace(index1, index1+1, ",").toString(); String str2 = name2.toString(); int index2 = str1.indexOf("{"); str2 = new StringBuilder(str2).replace(index2, index2+1, str1).toString(); JSONObject result = new JSONObject(str2); return result; } Просто обращайтесь: sliv (JSONObject (Ваш объект 1), JSONObject (Ваш объект 2) )

Комментариев нет:

Отправить комментарий