Слияние двух деревьев JSON с помощью Jerkson в Scala - PullRequest
2 голосов
/ 04 марта 2012

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

Я ничего не знаю из коробки с Джерксоном, но в библиотеке scala lift-json есть поддержка как слияния, так и разветвления деревьев json. Я знаю, что вы можете быть привязаны к Джерксону, поэтому, возможно, не сможете использовать его напрямую, но было бы интересно посмотреть, как они это реализовали. Документация и исходный код на github: https://github.com/lift/framework/tree/master/core/json#merging--diffing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...