首页 > 解决方案 > 在scala中使用jackson反序列化json

问题描述

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

{ "Domain1": { "data-file": "dataFile1", "filter": { "affected-object": "AffectedObject1", "affected-nd": "AffectedNd1" } }, "Domain2": { "data -file": "dataFile2", "filter": { "affected-ci": "AffectedCI2", "affected-net": "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)"

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

标签: scalascala-collections

解决方案


只要确保你使用ScalaObjectMapper

val mapper = new ObjectMapper() with ScalaObjectMapper

那么这应该工作:

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

推荐阅读