如何在 Scala 中获取两个 ObjectNode json 之间的差异?

How to get the differences between two ObjectNode jsons in Scala?

我想以可读的格式获取两个 Json 之间的差异。 上的答案使用 Java 地图。我尝试将 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 之间的区别?

首先你需要注册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)

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

另请参阅:

  • Compare two Maps in Scala