我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
我的问题原因对我来说似乎很不寻常,不确定是否有人在相同的条件下得到错误,我通过不同之前的提交找到了原因,在这里:
通过我的构建。gradle我正在使用这2个编译器选项,并注释掉这一行固定的问题
//compileJava.options.compilerArgs = ['-Xlint:unchecked','-Xlint:deprecation']
其他回答
我有这个问题,我修复了下面的代码。
@Configuration
open class JacksonMapper {
@Bean
open fun mapper(): ObjectMapper {
val mapper = ObjectMapper()
...
mapper.registerModule(KotlinModule())
return mapper
}
}
如果你使用Unirest作为http库,使用GsonObjectMapper而不是JacksonObjectMapper也可以工作。
<!-- https://mvnrepository.com/artifact/com.konghq/unirest-object-mappers-gson -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-object-mappers-gson</artifactId>
<version>2.3.17</version>
</dependency>
Unirest.config().objectMapper = GsonObjectMapper()
在下面的用例中遇到相同的错误。
我尝试使用sprint引导(2.0.0快照版本)在各自的bean中没有默认构造函数的情况下达到Rest(Put映射)端点。
但是在最新的Spring Boot版本(2.4.1版本)中,同一段代码可以正常运行。
因此在最新版本的Spring Boot中不再需要bean默认构造函数
我得到了同样的错误,在我添加了一个没有参数的构造函数后,问题就解决了。
您需要使用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来执行反序列化。
推荐文章
- Android:垂直对齐多行EditText(文本区域)
- Android无尽列表
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- 错误:执行失败的任务':app:compileDebugKotlin'。>编译错误。详细信息请参见日志
- 在Android中使用URI生成器或使用变量创建URL
- 缩放图像以填充ImageView宽度并保持纵横比
- 列表视图的自定义适配器
- 在Android中设置TextView span的颜色
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON
- 如何以编程方式在RelativeLayout中布局视图?
- Android Facebook集成无效键散列
- 什么是“android. r.b ayout.simple_list_item_1”?
- 将字符串转换为Uri
- 在Android中创建临时文件