首页 > 解决方案 > 如何解组代表不同类型数据数组的 JSON?

问题描述

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

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

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

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

使用杰克逊,我尝试过,例如:

第一次尝试:

使用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 ]

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

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

欢迎任何建议。

标签: jsonscalaspring-bootintellij-ideajackson

解决方案


最简单的方法是编写一个转换函数,将“丑陋的“默认”数据结构”映射到所需的结果。

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

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

我不知道 scala 中的 jackson 是如何工作的,但如果你的结果是Seq[Either[Person, Seq[Hobbie]]].


推荐阅读