3

我有这样的 JSON:

{
  "apps": [
    {
      "id": "1",
      ...
    },
    {
      "id": "2",
      ...
    }
  ]
}

例如说这个Application类看起来像这样

data class Application(
    val id: String
)

我想将 JSON 反序列化为List<Application>,其中每个{...}都是Application. 我希望做到这一点,而不必创建一个包装类Applications,比如用 注释它@JsonRootName,然后启用DeserializationFeature.UNWRAP_ROOT_VALUE. 最终目标是拥有一个Retrofit接口,它具有以下内容:

@GET("api/apps")
fun listApplications(): Call<List<Application>>

我试图实现一个简单的JsonDeserializer(可能会被优化):

class ApplicationListDeserializer
  : JsonDeserializer<List<Application>>() {

  companion object {
    private val COLLECTION_TYPE: CollectionType = TypeFactory.defaultInstance()
        .constructCollectionType(List::class.java, Application::class.java)
  }
  override fun deserialize(parser: JsonParser, context: DeserializationContext): List<Application> {
    val mapper = ObjectMapper()
    val node: JsonNode = parser.codec.readTree(parser)
    val collectionReader = mapper.readerFor(COLLECTION_TYPE)
    return collectionReader.readValue(node.get("apps"))
  }
}

我看不到任何方法可以为此特定类型注册此反序列化器。我试过这个:

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue

val objectMapper = ObjectMapper().registerModule(KotlinModule())
val module = SimpleModule()
module.addDeserializer(List::class.java, ApplicationListDeserializer())
objectMapper.registerModule(module)
val applications: List<Application> = objectMapper.readValue("""{
  "apps": [
    {
      "id": "/api-catalog-backend"
    }
  ]
}""")

但这失败了:

Can not construct instance of Application: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)&#xa; at [Source: N/A; line: -1, column: -1] (through reference chain: java.util.ArrayList[0])" type="com.fasterxml.jackson.databind.JsonMappingException"><![CDATA[com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Application: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: N/A; line: -1, column: -1] (through reference chain: java.util.ArrayList[0])
  at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
  at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
  at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012)

我正在使用以下依赖版本:

compile("com.fasterxml.jackson.core", "jackson-core", "2.8.6")
compile("com.fasterxml.jackson.module", "jackson-module-kotlin", "2.8.4")
compile(kotlinModule("stdlib", "1.1-M03"))
compile(kotlinModule("reflect", "1.1-M03"))

如何配置反序列化以与 a 一起正常工作List<Application>

4

0 回答 0