Обрабатывать разные типы для некоторых полей при сериализации и десериализации с Джексоном - PullRequest
0 голосов
/ 18 мая 2018

Я использую 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":""
}

такгде все "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 голосов
/ 18 мая 2018

В вашем типе сложного объекта вы можете определить метод toString (), а затем аннотировать его с помощью @ JsonValue .Это будет указывать Джексону, что возвращаемым результатом будет значение, сериализованное для этого объекта.Вы можете реализовать любую логику, которая вам там нужна, чтобы представлять сложный тип так, как вы хотите.например:

@JsonValue
public String toString() {
   return value;
}
0 голосов
/ 18 мая 2018

Зачем вам "complex": {"link": "...", "value": "..."}, для документации API?

...