微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Scala中使用jackson反序列化json

如何解决在Scala中使用jackson反序列化json

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

{ "Domain1": { "data-file": "dataFile1","filter": { “受影响对象”:“Affectedobject1”,“受影响对象”: "Affectednd1" } },"Domain2": { "data-file": "dataFile2","filter": { "affected-ci": "AffectedCI2","affected-net": "Affectednet2" } } }

我尝试使用案例类,并首先尝试在“readValue”方法的 ValueType 中使用“ClassOf”,但输出是 Map 对象的 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,Domain2 -> 
CrossDomainFilterObj(dataFile2,Map(affected-ci -> 
AffectedCI2,affected-net -> Affectednet2)))

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

case class CrossDomainFilterObj(@JsonProperty("data-file")dataFile: String,\"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)"

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

解决方法

只要确保使用 ScalaObjectMapper

val mapper = new ObjectMapper() with ScalaObjectMapper

那么这应该有效:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。