在Scala中使用Jerkson合并两个JSON树

时间:2012-03-03 22:13:25

标签: json scala

看似简单的事情,也许在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 

1 个答案:

答案 0 :(得分:0)

我不知道Jerkson的任何开箱即用,但lift-json scala库支持合并和区分json树。我知道你可能与Jerkson有关,所以可能无法直接使用它,但看看它们是如何实现的可能是有意义的。文档和源代码在github上:https://github.com/lift/framework/tree/master/core/json#merging--diffing