注册反序列化器以包装类型的List

我有这样的JSON:

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

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

 data class Application( val id: String ) 

我想将JSON反序列化为List<Application> ,其中每个{...}都是一个Application 。 我希望能够做到这一点,而不必创建一个类似Applications的包装类,用@JsonRootName对其进行@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?)
 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")) 

如何配置反序列化以正确使用List<Application>