【发布时间】: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 库。有很多选项,circe、play-json、uplicke、jsonitter-scala等跨度>
-
是的,如果它被广泛使用并且受支持的 Scala 库对我有用。