我想知道如何通过覆盖现有对象上的一些键值来创建新的jsonObject。在我的例子中,我有一个jsonObject existingData
和一个Maporder,Any>。
// order is of type Map<String, Any?>
val keys = listOf("service", "customerContact", "deliveryAddress", "deliveryZipCode", "deliveryZipArea", "deliveryCountryCode", "deliveryPhoneNumber")
val newObject = existingData
.toMap()
.foldLeft(jsonObject()) { acc, entry ->
if (relevantKeys.contains(entry.key)
&& !matching(entry.value, order.get(entry.key))
) acc.set(entry.key, order?.get(entry.key).toString())
else acc.set(entry.key, entry.value.asString)
}
因此,这里我需要检查keys
列表是否包含jsonObject上的键,以及对象上该键的值是否与order
映射条目的值不同。如果它们不匹配,则应使用order Map中的值更新对象上的键。在js中我会使用reduce,但我对kotlin不是很熟悉,而且由于我们不能在JsonObject上使用fold,我想知道如何做这样的事情?
发布于 2021-10-13 10:35:48
如果我没理解错的话,你只是想要这个:
val newObject = existingData.deepCopy().apply {
for (key in relevantKeys) {
add(key, Gson().toJsonTree(order[key]))
}
}
如果键已经存在,add
将覆盖旧值。toJsonTree
将Any?
转换为JsonElement
。这是假设order
内部的东西可以在没有更多类型信息的情况下转换成JSON。
https://stackoverflow.com/questions/69560072
复制相似问题