【问题标题】:How to get the differences between two ObjectNode jsons in Scala?如何在 Scala 中获取两个 ObjectNode json 之间的差异?
【发布时间】:2021-06-24 09:33:26
【问题描述】:

我想以可读的格式获取两个 Json 之间的差异。 this thread 上的答案使用 Java Maps。我尝试将 ObjectNodes 转换为 Scala Maps,但没有成功:

val objectMapper = new ObjectMapper()
val jsonNode = objectMapper.readValue(expectedJson, classOf[ObjectNode])
val otherNode = objectMapper.readTree(serviceJson).asInstanceOf[ObjectNode]
val converted = objectMapper.convertValue(jsonNode, new TypeReference[Map[String, Any]] {})

有没有办法将 ObjectNode 转换为地图,以便我可以使用其他答案中给出的 Guava 函数?也许有一种更简单的方法来比较和获取 Scala 中两个 Json 之间的区别?

【问题讨论】:

    标签: json scala jackson


    【解决方案1】:

    首先你需要注册DefaultScalaModule模块。您可以在 Maven 存储库页面上找到它:Jackson Module Scala

    注册后,您可以轻松地将JSON 直接反序列化为Map。当然,根JSON节点必须是JSON Object

    例如,假设我们有两个 JSON 有效载荷:

    {
      "field": "https://somethingh.com",
      "type": "object",
      "metaType": "object"
    }
    

    {
      "type2": "object",
      "metaType": "object2"
    }
    

    我们可以这样解读:

    import com.fasterxml.jackson.databind.json.JsonMapper
    import com.fasterxml.jackson.module.scala.DefaultScalaModule
    
    import java.io.File
    import scala.collection.immutable
    
    object JsonScalaApp {
    
      def main(args: Array[String]) {
        val jsonFile = new File("./src/main/resources/test.json")
        val jsonFile2 = new File("./src/main/resources/test2.json")
        val mapper = JsonMapper.builder()
          .addModule(DefaultScalaModule)
          .build()
        val map1 = mapper.readValue(jsonFile, classOf[immutable.HashMap[String, Any]])
        val map2 = mapper.readValue(jsonFile2, classOf[immutable.HashMap[String, Any]])
        val diff1 = (map1.toSet diff map2.toSet).toMap
        val diff2 = (map2.toSet diff map1.toSet).toMap
    
        println(map1)
        println(map2)
        println(diff1)
        println(diff2)
      }
    }
    

    上面的代码打印:

    Map(field -> https://somethingh.com, type -> object, metaType -> object)
    Map(type2 -> object, metaType -> object2)
    Map(field -> https://somethingh.com, type -> object, metaType -> object)
    Map(type2 -> object, metaType -> object2)
    

    您可以使用自定义实现来查找链接问题的所有差异。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多