假设我们有一个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
中进行操作。
答案 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"