Казалось бы, простая вещь, возможно, в 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