[英]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.