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

时间:2018-05-18 09:15:53

标签: java jackson pojo

我正在使用杰克逊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":""
}

所以"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错误。

谢谢!

2 个答案:

答案 0 :(得分:1)

在复杂对象类型上,您可以定义toString()方法,然后使用@JsonValue对其进行批注。这将向Jackson表明返回的结果将是为该对象序列化的值。您可以实现您需要的任何逻辑,以您希望的方式表示Complex类型。 e.g:

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

答案 1 :(得分:0)

你为什么需要  &#34;复合&#34;:{      &#34;连结&#34;:&#34; ...&#34 ;,      &#34;值&#34;:&#34; ...&#34;   }, 对于api文档?