java - 使用 Jackson 进行序列化和反序列化时处理某些字段的不同类型

标签 java jackson pojo

我正在使用 Jackson 2。 从远程服务读取时,我获得一个如下所示的 JSON 对象:

{
  "country":"1",
  "complex":{
     "link":"...",
     "value":"..."
  },
  "test":""
}

因此我为此目的创建了相关的 POJO:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "link",
    "value"
})
public class Complex {

    @JsonProperty("link")
    private String link;

    @JsonProperty("value")
    private String value;

    @JsonProperty("link")
    public String getLink() {
        return link;
    }

    @JsonProperty("link")
    public void setLink(String link) {
        this.link = link;
    }

    @JsonProperty("value")
    public String getValue() {
        return value;
    }

    @JsonProperty("value")
    public void setValue(String value) {
        this.value = value;
    }
}


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "country",
    "complex",
    "test"
})
public class Resource {

    @JsonProperty("country")
    private String country;

    @JsonProperty("complex")
    private Complex complex;

    @JsonProperty("test")
    private String test;

    @JsonProperty("country")
    public String getCountry() {
        return country;
    }

    @JsonProperty("country")
    public void setCountry(String country) {
        this.country = country;
    }

    @JsonProperty("complex")
    public Complex getComplex() {
        return complex;
    }

    @JsonProperty("complex")
    public void setComplex(Complex complex) {
        this.complex = complex;
    }

    @JsonProperty("test")
    public String getTest() {
        return test;
    }

    @JsonProperty("test")
    public void setTest(String test) {
        this.test = test;
    }

}

这样我就能做到:

Resource res = MAPPER.readValue(response.readEntity(String.class), Resource.class);

我的问题是,在执行POST请求时,我需要发送一个不同的对象,即:

{
  "country":"1",
  "complex": "value",
  "test":""
}

所以所有“复杂”对象必须是简单的字符串。

知道如何处理这种情况吗?

我尝试创建一个 JsonDeserializer 类:

public class ComplexValueDeserializer extends JsonDeserializer<Object> {
    @Override
    public Object deserialize(final JsonParser parser, final DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        final JsonToken jsonToken = parser.getCurrentToken();

        if (jsonToken == null
                || (jsonToken == JsonToken.START_OBJECT && parser.getValueAsString().equals("{}"))) {
            return "";
        }
        return null;
    }
}

并将其添加到:

@JsonProperty("complex")
@JsonDeserialize(using = ComplexValueDeserializer.class)
private Complex complex;

但我收到java.lang.IllegalArgumentException:参数类型不匹配错误。

谢谢!

最佳答案

在复杂对象类型上,您可以定义一个 toString() 方法,然后用 @JsonValue 对其进行注释。 。这将向 Jackson 表明返回的结果将是为该对象序列化的值。您可以让他们实现您需要的任何逻辑,以您想要的方式表示 Complex 类型。例如:

@JsonValue
public String toString() {
   return value;
}

关于java - 使用 Jackson 进行序列化和反序列化时处理某些字段的不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407854/

相关文章:

java - Instant 和 ZonedDateTime 之间的兼容性

java - Linux Java 开发人员可以在同一个包中创建名称仅大小写不同的类吗?

java - jackson 解析复杂对象

Java Opencsv 使用 csv 文件中的(名字中的双引号)和(名字中双引号中的逗号)列解析 csv

java - 如何部署一个简单的Drools应用程序?

java - Intellij - 像在 Eclipse 中一样添加项目依赖

java - 如何正确地向客户端发送 HTTP 消息

java - JSON正确反序列化ArrayList

java - Jackon 自定义解串器从未调用过

java - 无法在 JBoss 6.1 中从 sar 部署 POJO