繁体   English   中英

如何解组代表不同类型数据数组的 JSON?

[英]How to unmarshall a JSON that represents an Array of different type of data?

我正在使用 Scala 和 SpringBoot 尝试使用 API 端点。

通过 REST 调用请求数据时,我收到以下格式的 json:

[{"name":"John","lastName":"Appleseed"},[{"hobbie":"swimming"},{"hobbie":"language practitioning"}]]

据我所知,这代表一个对象数组,但也许我错了。

使用 Jackson,我尝试过,例如:

第一次尝试:

使用Seq[ Seq[ Hobbie ] ]

  val mapper = new ObjectMapper() with ScalaObjectMapper
  mapper.registerModule( DefaultScalaModule )
  mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false )
  
  logger.info( "\n\nInformation unmarshalling:" )
  case class Hobbie( @JsonProperty( value = "hobbie" ) hobbie: String )
  
  val informationJson = """ [{"name":"John","lastName":"Appleseed"},[{"hobbie":"swimming"},{"hobbie":"language practitioning"}]] """.trim
  val information = mapper.readValue[ Seq[ Seq[ Hobbie ] ] ]( informationJson )
  println( information )

,但我得到一个错误

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `scala.collection.Seq<com.playground.Application$Hobbie>` out of START_OBJECT token
 at [Source: (String)"[{"name":"John","lastName":"Appleseed"},[{"hobbie":"swimming"},{"hobbie":"language practitioning"}]]"; line: 1, column: 2] (through reference chain: com.fasterxml.jackson.module.scala.deser.GenericFactoryDeserializerResolver$BuilderWrapper[0])

第二次尝试:

使用Seq[ Any ]

数据被读取,但它创建了一个丑陋的“默认”数据结构。

我试图找出最好的 class 来解组数据,但似乎没有任何工作正常。

欢迎任何建议。

最简单的方法是编写一个转换 function ,它将 map '丑陋的“默认”数据结构'转换为所需的结果。

如果您想要一个生产解决方案,您应该编写自己的Mapper并使用自定义实现来产生所需的结果。

关于结果的类型的一点提示 - 如果您在同一嵌套级别的数组中有 2 个类型 - 您可以使用Either[FirstType, SecondType]

我不知道 scala 中的 jackson 是如何工作的,但如果你的结果是Seq[Either[Person, Seq[Hobbie]]] ,它可能会开箱即用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM