我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
如果你使用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()
其他回答
在类中添加构造函数 或 如果您正在使用pojo添加 @NoArgsConstructor @AllArgsConstructor
还要包括JsonProperty - @JsonProperty("name") private List<员工>姓名;
在我的案例中,问题只发生在构建类型发布中,是由于包含存根的“\dto”文件夹中的一些类被模糊了。 为了解决这个问题,我在proguard-rules中添加了以下规则。支持文件:
-keep public class com.your.app_package.dto.** { *; }
-keep @**annotation** class * {*;}
#Preserve JacksonXml (PUBLIC_ONLY crash fix)
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.** { *; }
-keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility {
public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; }
扩展Yoni Gibbs的回答,如果你在一个android项目中使用改装和配置序列化与Jackson,你可以做这些事情,以便反序列化工作预期与kotlin的数据类。
在你的build gradle导入中:
implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.11.+"
然后,你的改造实施:
val serverURL = "http://localhost:8080/api/v1"
val objectMapper = ObjectMapper()
objectMapper.registerModule(KotlinModule())
//Only if you are using Java 8's Time API too, require jackson-datatype-jsr310
objectMapper.registerModule(JavaTimeModule())
Retrofit.Builder()
.baseUrl(serverURL)
.client(
OkHttpClient.Builder()
.readTimeout(1, TimeUnit.MINUTES)//No mandatory
.connectTimeout(1, TimeUnit.MINUTES)//No mandatory
.addInterceptor(UnauthorizedHandler())//No mandatory
.build())
.addConverterFactory(
JacksonConverterFactory.create(objectMapper)
)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
数据类:
@JsonIgnoreProperties(ignoreUnknown = true)
data class Task(val id: Int,
val name: String,
@JsonSerialize(using = LocalDateTimeSerializer::class)
@JsonDeserialize(using = LocalDateTimeDeserializer::class)
val specificDate: LocalDateTime?,
var completed: Boolean,
val archived: Boolean,
val taskListId: UUID?
我在这里搜索这个错误:
No Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator
与Retrofit无关,但如果您正在使用Jackson,则通过向抛出错误的类添加默认构造函数来解决此错误。 更多信息请点击:https://www.baeldung.com/jackson-exception
我用Quarkus, Jackson和Lombok。所以我通过在模型类上添加@Jacksonized属性解决了这个问题。 所以所有的属性是:
@Jacksonized //missing
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ...
推荐文章
- 改变开关的“开”色
- 以编程方式将EditText的输入类型从PASSWORD更改为NORMAL,反之亦然
- 如何在隐藏和查看密码之间切换
- 在Android上调整一个大的位图文件到缩放输出文件
- 如何更改Android版本和代码版本号?
- Android Studio突然无法解析符号
- 应用程序重新启动而不是恢复
- 如何设置整个应用程序在纵向模式?
- Android中文本的阴影效果?
- 以编程方式设置TextView的布局权重
- Android -如何覆盖“后退”按钮,所以它不完成()我的活动?
- 如何从通知点击发送参数到一个活动?
- 导航目标xxx对于这个NavController是未知的
- 使用ConstraintLayout均匀间距的视图
- 文件google-services错误。模块根文件夹中缺少Json。谷歌服务插件没有它就不能正常工作。