看似简单的事情,也许在Jerkson中有内置例程,但我编写了一个简单的合并函数。它应该合并两个JSON树,合并字典并覆盖源中的任何内容,并使用更新值进行更新,并在更新中包含任何不在源中的内容。我想这是你想要合并的个人选择,所以我可以看到没有内置的。我想验证没有更好的方法,这种方式并不愚蠢。
def merge(name: String, source: JObject, update: JObject) : JField = {
JField(name, JObject(
source.fields.map { x: JField =>
// Do we have an updated value in our update
findValue(x.name, update) match {
// If so check what kind of value
case Some(updatedField) => updatedField match {
// If it's an object, merge it down
case updatedObject: JObject => {
x.value match {
case sourceObject: JObject => merge(x.name, sourceObject, updatedObject)
case other => JField(x.name, updatedObject)
}
}
case other => other
}
case None => x
}
}
// Concat with a list of fields that exist in the update and not in the source
::: (update.fields.filter { x =>
findValue(x.name, source) match {
case None => true
case Some() => false
}
})
))
}
def findValue(name: String, obj: JObject) : Option[JField] = obj.fields.filter(_.name==name).headOption
答案 0 :(得分:0)
我不知道Jerkson的任何开箱即用,但lift-json scala库支持合并和区分json树。我知道你可能与Jerkson有关,所以可能无法直接使用它,但看看它们是如何实现的可能是有意义的。文档和源代码在github上:https://github.com/lift/framework/tree/master/core/json#merging--diffing