我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。


当前回答

我可以在@JacksonProperty注释的帮助下在Kotlin中解决这个问题。上述情况的用法示例如下:

import com.fasterxml.jackson.annotation.JsonProperty
...
data class Station(
     @JacksonProperty("repsol_id") val repsol_id: String,
     @JacksonProperty("name") val name: String,
...

其他回答

我有这个问题,我修复了下面的代码。

@Configuration
open class JacksonMapper {

    @Bean
    open fun mapper(): ObjectMapper {
        val mapper = ObjectMapper()
        ...

        mapper.registerModule(KotlinModule())
        return mapper
    }
}

您需要使用jackson-module-kotlin反序列化到数据类。详情请看这里。

上面的错误消息是Jackson给你的,如果你试图反序列化一些值到一个数据类,而该模块没有启用,或者即使启用了,当它使用的ObjectMapper没有注册KotlinModule时。例如,下面的代码:

data class TestDataClass (val foo: String)

val jsonString = """{ "foo": "bar" }"""
val deserializedValue = ObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

这将失败,并出现以下错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.SerializationTests$TestDataClass` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

如果您更改上面的代码并将ObjectMapper替换为jacksonObjectMapper(它只是返回一个注册了KotlinModule的普通ObjectMapper),它就可以工作。即。

val deserializedValue = jacksonObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

我不确定Android方面的情况,但看起来您需要让系统使用jacksonObjectMapper来执行反序列化。

原因:发生此错误是因为jackson库不知道如何创建没有空构造函数的模型,并且模型包含带有参数的构造函数,该构造函数没有使用@JsonProperty("field_name")注释其参数。默认情况下,如果你没有给你的类添加构造函数,java编译器会创建空构造函数。

解决方案: 向模型中添加一个空构造函数或使用@JsonProperty("field_name")注释构造函数参数

如果你使用Kotlin数据类,那么也可以用@JsonProperty("field_name")进行注释,或者将jackson模块Kotlin注册到ObjectMapper。

您可以使用http://www.jsonschema2pojo.org/创建您的模型。

我知道这是一个老帖子,但对于任何使用Retrofit的人来说,这可能是非常有用的。

如果你正在使用Retrofit + Jackson + Kotlin + Data类,你需要:

添加实现组:com.fasterxml.jackson。,名称:' Jackson -module-kotlin',版本:'2.7.1-2'到你的依赖,这样Jackson可以反序列化到数据类 当构建翻新时,传递Kotlin Jackson Mapper,以便翻新使用正确的映射器,例如:

    val jsonMapper = com.fasterxml.jackson.module.kotlin.jacksonObjectMapper()

    val retrofit = Retrofit.Builder()
          ...
          .addConverterFactory(JacksonConverterFactory.create(jsonMapper))
          .build()

注意:如果没有使用Retrofit, @Jayson Minard有一个更一般的方法回答。

我有一个类似的问题(使用Jackson, lombok, gradle)和一个没有args构造函数的POJO -解决方案是添加

lombok.anyConstructor.addConstructorProperties=true

去龙目岛。配置文件