在scala中使用jackson反序列化json

在scala中使用jackson反序列化json,scala,scala-collections,Scala,Scala Collections,我正在尝试使用jackson json api将下面的json字符串反序列化为scala对象 {“域1”:{“数据文件”:“数据文件1”,“筛选器”:{ “受影响对象”:“受影响对象1”,“受影响对象nd”: “AffectedNd1”}},“域2”:{“数据文件”:“数据文件2”, “筛选器”:{“受影响的ci”:“受影响的ci 2”,“受影响的网络”: “AffectedNet2”}}} 我尝试使用case类,并尝试首先在“readValue”方法的ValueType中使用“ClassOf”

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

{“域1”:{“数据文件”:“数据文件1”,“筛选器”:{ “受影响对象”:“受影响对象1”,“受影响对象nd”: “AffectedNd1”}},“域2”:{“数据文件”:“数据文件2”, “筛选器”:{“受影响的ci”:“受影响的ci 2”,“受影响的网络”: “AffectedNet2”}}}

我尝试使用case类,并尝试首先在“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, affected-nd -> AffectedNd1)), Domain2 -> 
CrossDomainFilterObj(dataFile2, Map(affected-ci -> 
AffectedCI2, affected-net -> AffectedNet2)))
dead code following this construct 

"val data = mapper.readValue(jsonString, reference)"
但我期待的输出如下

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)))
dead code following this construct 

"val data = mapper.readValue(jsonString, reference)"
然后我尝试使用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)
我得到的错误如下

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)))
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)

我建议使用Scala库而不是Java库。有很多选项,circe,play json,uplicke,jsonitter scala等。是的,如果它被广泛使用和支持,scala库将对我起作用。当我尝试上述方法时,我遇到了类似“找不到抽象类型的值反序列化器”的错误code@Mohan我不知道,