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



我想以可读的格式获得两个Json之间的差异。这个线程上的答案使用Java映射。我尝试将ObjectNodes转换为Scala映射,但没有成功:

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)

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

另请参阅:

  • 比较Scala中的两个映射

最新更新