如何仅更新Android中现有Json对象中对象的Non Null Json字段

时间:2019-04-10 19:54:17

标签: android json kotlin

假设我们有一个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"
}

请注意,ageaddress已更改。这可以通过对小型用户对象进行null检查来完成,但对于像Product这样的具有100多个字段的对象来说,看起来还不够聪明。

寻找一种有效的方法来在Java / Kotlin中进行操作。

2 个答案:

答案 0 :(得分:1)

您可以为其使用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();
 } 

而且没有数据库,如您所见)))

答案 1 :(得分:1)

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"