注册反序列化器以包装类型的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>
?