簡體   English   中英

使用Jackson進行序列化和反序列化時,處理某些字段的不同類型

[英]Handle different types for some fields while serializing and deserializing with Jackson

我正在使用Jackson2。從遠程服務讀取時,我將獲得一個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":""
}

因此,所有"complex"對象都必須只是字符串。

關於如何處理這種情況的任何想法?

我試圖創建一個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: argument type mismatch錯誤。

謝謝!

在您的復雜對象類型上,您可以定義toString()方法,然后使用@JsonValue對其進行注釋 這將向Jackson指示返回的結果將是該對象的序列化值。 您可以讓他們實現所需的任何邏輯,以所需的方式表示Complex類型。 例如:

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

為什么需要api文檔的“ complex”:{“ link”:“ ...”,“ value”:“ ...”}?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM