with type polymorphic only instantiated information defaulttyping additional java json inheritance jackson marshalling

java - type - jackson nested json



Objeto Java extendiendo una lista a Json con Jackson (1)

Quiero convertir un objeto que extiende una lista a Json usando Jackson. Ejemplo:

public class TryToSerialize extends ArrayList<String> { private int number; private String word; public TryToSerialize(){ number = 0; word = ""; } @JsonProperty public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } @JsonProperty public String getWord() { return word; } public void setWord(String word) { this.word = word; } @JsonIgnore public String getAsJSON() throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File("c://tts.json"), this); return mapper.writeValueAsString(this) ; } }

Cuando serializo esto, solo obtendré la porción de Array.

TryToSerialize tts = new TryToSerialize(); tts.setNumber(10); tts.setWord("Working"); tts.add("first"); tts.add("second"); tts.add("third"); String json = tts.getAsJSON();

Json:

["first","second","third"]

Estoy buscando una manera de incluir las otras variables del objeto.


Como su objeto se extiende a una de las clases para las que existe un comportamiento de serialización predeterminado, los campos adicionales se ignoran.

Ahora, una cosa que no me queda clara es cuál debería ser el resultado esperado.

Si está esperando un resultado como:

{"number":10,"word":"Working","values":["first","second","third"]}

Entonces deberías poder hacerlo gracias a un serializador personalizado como el siguiente:

public class MySerializer extends JsonSerializer<TryToSerialize> { @Override public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("number", toSerialize.getNumber()); jgen.writeStringField("word", toSerialize.getWord()); provider.defaultSerializeField("values", toSerialize.iterator(), jgen); jgen.writeEndObject(); } }

Si está esperando un resultado como:

[10,"Working","first","second","third"]

Entonces, el serializador se verá así:

public class MySerializer extends JsonSerializer<TryToSerialize> { @Override public void serialize(TryToSerialize toSerialize, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartArray(); jgen.writeNumber(toSerialize.getNumber()); jgen.writeString(toSerialize.getWord()); for (Iterator<String> iterator = toSerialize.iterator(); iterator.hasNext();) { jgen.writeString((String) iterator.next()); } jgen.writeEndArray(); } }

Luego, en ambos casos, anota tu clase con:

@JsonSerialize(using = MySerializer.class)

Puede haber formas más inteligentes pero esto debería funcionar ...