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


当前回答

我用Quarkus, Jackson和Lombok。所以我通过在模型类上添加@Jacksonized属性解决了这个问题。 所以所有的属性是:

@Jacksonized //missing
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ...

其他回答

我用龙目岛。我得到的错误,因为我没有把@NoArgsConstructor在我的模型类。

如果您在POJO模型上使用Lombok,请确保您有这些注释:

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor

它可以有所不同,但要确保@Getter,特别是@NoArgsConstructor。

对于我们没有默认构造的类,例如当使用不可变对象时,Jackson默认情况下将不能将JSON反序列化为对象。 我们可以使用一些注释来解决这个问题,比如@JsonCreator,它可以帮助Jackson知道如何反序列化给定的JSON。

示例代码如下所示:

package com.test.hello;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Payment {

    private final Card card;

    private final Amount amount;

    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public Payment(@JsonProperty("card") Card card, @JsonProperty("amount") Amount amount) {
       this.card = card;
       this.amount = amount;
    }

    public Card getCard() {
       return card;
    }

    public Amount getAmount() {
        return amount;
    }
}

使用Lombok时要小心,尤其是@Builder。

解决这个问题的方法是:

   @JsonDeserialize(builder = X.XBuilder.class)
       class X{
          @JsonPOJOBuilder(withPrefix = "")
          public static class XBuilder{

          }
}

我希望它能让你的生活更轻松

您需要使用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来执行反序列化。