我有这样的 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?)
 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>?