java/jackson - angekettet @JsonValue Anmerkungen und Deserialisierung
Habe ich die folgende Konstruktion. Ich weiß, es scheint seltsam, aber ich bin zu simulieren, unseren code mit diesem Beispiel:
public static class StringWrapper {
protected final String s;
@JsonValue
public String getS() {
return s;
}
public StringWrapper(final String s) {
this.s = s;
}
}
public static class StringWrapperOuter {
protected final StringWrapper s;
@JsonValue
public StringWrapper getS() {
return s;
}
public StringWrapperOuter(final StringWrapper s) {
this.s = s;
}
}
public static class POJO {
protected final List<StringWrapperOuter> data;
public List<StringWrapperOuter> getData() {
return data;
}
public POJO(final List<StringWrapperOuter> data) {
this.data = data;
}
public POJO() {
data = Collections.emptyList();
}
}
Serialisierung der POJO gibt die erwarteten JSON-array von strings:
<mapper>.writeValue(System.out, new POJO(Arrays.asList(new StringWrapperOuter(new StringWrapper("a")), new StringWrapperOuter(new StringWrapper("b")), new StringWrapperOuter(new StringWrapper("c")))));
{"data":["a","b","c"]}
Wie kann ich Deserialisieren dieser JSON-string in ein Objekt vom Typ POJO?
<mapper>.readValue("{\"data\":[\"a\",\"b\",\"c\"]}", POJO.class);
Der mapper hat Schwierigkeiten zu erkennen, der Eingang, der seit zwei @JsonValue
Anmerkungen gefesselt sind. Es gibt folgende Ausnahme:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class StringWrapperOuter] from String value ('a'); no single-String constructor/factory method
at [Source: {"data":["a","b","c"]}; line: 1, column: 10] (through reference chain: POJO["data"]->java.util.ArrayList[0])
Du musst angemeldet sein, um einen Kommentar abzugeben.
@JsonValue
ist zum serialisieren. Die Analog-Anmerkung für die Deserialisierung ist@JsonCreator
.Anmerkungen in Ihren Konstruktoren
und
Als Sotirios sagte in einer vorherigen Antwort. Die
@JsonCreator
ist hier der Schlüssel. Aber, um alle Klassen zu arbeiten@JsonProperty
benötigt werden könnten.