Как обновить только ненулевые поля Json объекта в существующем объекте Json в Android - PullRequest
0 голосов
/ 10 апреля 2019

Предположим, у нас есть ответ User JSON:

{
    "name": "Jack",
    "age": 28,
    "address": "Some address",
    "occupation": "Employee",
    "gender":"male"
}

С некоторыми сетевыми вызовами мы получили еще один ответ JSON:

{ "age":"27", "address":"Some new address" }

ТеперьТребуется обновить существующий объект с обновленными полями.Например:

{
    "name": "Jack",
    "age":"27",
    "address":"Some new address",
    "occupation": "Employee",
    "gender":"male"
}

Обратите внимание, что age и address были изменены.Это можно сделать, сделав null проверки для небольшого пользовательского объекта, но не выглядит достаточно умным для такого объекта, как Product, который будет иметь более 100 полей.

Поиск эффективного способа сделать этов Java / Kotlin.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

A JSONObject - это просто карта ключей / значений.Предполагая, что вы заботитесь только о глубине одного уровня, здесь тривиальным подходом будет просто отобразить ключ / значения из второго объекта (где значения не равны нулю) в текущий объект.

Это можно определить как функцию расширения для JSONObject, например:

fun JSONObject.mergeWith(other: JSONObject): JSONObject = apply {
    other.keys()
        .asSequence()
        .associateWith(other::get)
        .filterValues { it != null }
        .forEach { (key, value) -> this.put(key, value) }
}

Например:

val firstJson = JSONObject().apply {
    put("x", 1)
    put("y", "1")
}

val secondJson = JSONObject().apply {
    put("x", 2)
    put("y", null)
}

val mergedJson = firstJson.mergeWith(secondJson) // contains x = 2, y = "1"
1 голос
/ 10 апреля 2019

Вы можете использовать для него HashMap, пусть имя значения будет ключом, а значение будет значением))):

HashMap<String, String> hashMap = new HashMap<String, String>(); 


    hashMap.put("name", "Jack"); 
    hashMap.put( "age", "27");

Теперь, если вам нужно обновить значения, просто добавьтеэто с тем же ключом:

 hashMap.put( "age", "67");

Теперь вам просто нужно перебрать ваш hashMap и получить все значения обратно, это может быть так:

 Iterator it = hashMap.entrySet().iterator();
 while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();
    System.out.println(pair.getKey() + " = " + pair.getValue());
    it.remove();
 } 

И без базы данных, каквидно)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...