在scala中使用jackson反序列化json

Posted

技术标签:

【中文标题】在scala中使用jackson反序列化json【英文标题】:Deserialization of json using jackson in scala 【发布时间】:2021-06-11 22:23:14 【问题描述】:

我正在尝试使用 jackson json api 将以下 json 字符串反序列化为 scala 对象

"Domain1": "data-file": "dataFile1", "filter": “受影响的对象”:“受影响的对象1”,“受影响的nd”: "AffectedNd1" , "Domain2": "data-file": "dataFile2", “过滤器”:“受影响的CI”:“受影响的CI2”,“受影响的网络”: "AffectedNet2"

我尝试使用案例类并首先尝试在“readValue”方法的 ValueType 中使用“ClassOf”,但输出是 Map Object 的 Map。数据不转换为案例类对象。

case class CrossDomainFilterObj(@JsonProperty("data-file")dataFile: String, 
@JsonProperty("filter")filter: Map[String,String])

val jsonString = "\"Domain1\": \"data-file\": \"dataFile1\", \"filter\":  \"affected-object\":
\"AffectedObject1\", \"affected-nd\" : \"AffectedNd1\",\"Domain2\": \"data-file\": 
\"dataFile2\", \"filter\":  \"affected-ci\":\"AffectedCI2\", \"affected-net\" : 
\"AffectedNet2\""

val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
val data = mapper.readValue(jsonString, classOf[Map[String, CrossDomainFilterObj]])
println(data)

我得到如下输出

Map(Domain1 -> Map(data-file -> dataFile1, filter -> Map(affected-object ->
AffectedObject1, affected-nd -> AffectedNd1)), Domain2 -> Map(data-file -> 
dataFile2, filter -> Map(affected-ci -> AffectedCI2, 
affected-net -> AffectedNet2)))

但我期待如下输出

Map(Domain1 -> CrossDomainFilterObj(dataFile1, Map(affected-object -> 
AffectedObject1, affected-nd -> AffectedNd1)), Domain2 -> 
CrossDomainFilterObj(dataFile2, Map(affected-ci -> 
AffectedCI2, affected-net -> AffectedNet2)))

然后我尝试使用 TypeReference 作为 ValueType,如下所示,

case class CrossDomainFilterObj(@JsonProperty("data-file")dataFile: String, 
@JsonProperty("filter")filter: Map[String,String])

val jsonString = "\"Domain1\": \"data-file\": \"dataFile1\", \"filter\":  \"affected-object\":
\"AffectedObject1\", \"affected-nd\" : \"AffectedNd1\",\"Domain2\": \"data-file\": 
\"dataFile2\", \"filter\":  \"affected-ci\":\"AffectedCI2\", \"affected-net\" : 
\"AffectedNet2\""

val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)

val reference = new TypeReference[Map[String, CrossDomainFilterObj]] 
val data = mapper.readValue(jsonString, reference)
println(data)

我收到如下错误

dead code following this construct 

"val data = mapper.readValue(jsonString, reference)"

有人可以帮助确定我在这里做错了什么。

【问题讨论】:

我建议使用 Scala 库而不是 Java 库。有很多选项,circeplay-jsonuplickejsonitter-scala等跨度> 是的,如果它被广泛使用并且受支持的 Scala 库对我有用。 【参考方案1】:

只要确保你使用ScalaObjectMapper:

val mapper = new ObjectMapper() with ScalaObjectMapper

那么这应该可以工作:

val data = mapper.readValue[Map[String, CrossDomainFilterObj]](jsonString)

【讨论】:

当我尝试上述代码时,出现“找不到抽象类型的值反序列化器”之类的错误 @Mohan 我不知道,works for me

以上是关于在scala中使用jackson反序列化json的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson 来(反)序列化 Scala 案例类

Jackson关于Boolean类型反序列化问题

如何使用jackson(Java)反序列化对象中的json对象?

如何在 Jackson 中记录 JSON 反序列化

如何使用 Jackson 反序列化来自 json 对象的对象数组

json之jackson序列化反序列化探究(二)