jsondeserialize enum deserializer deserialize custom java json jackson deserialization jackson-modules

java - enum - Jackson desrialize cuando JsonProperty es a veces array y a veces un solo objeto



objectmapper add custom deserializer (1)

He buscado Stack Overflow antes de publicarlo, pero no hubo soluciones para Jackson.

Aquí hay una respuesta del servidor:

{ "ok": true, "result": [ { "update_id": 489881731, //rest }, { "update_id": 489881732, //rest } ] }

Como puede ver, la propiedad "result" es una matriz.

Ahora esta es otra respuesta:

{ "ok": true, "result": { "id": 211948704, "first_name": "ربات ادمین‌های تلگرام", "username": "tgAdminsBot" } }

Aquí el "result" es un solo objeto.

Esta es mi clase. Quiero deserializar el contenido. Escribí un deserializador personalizado para TObject por supuesto:

public class Result { private TObject[] result; private boolean ok; public void setOk (boolean ok) {//code} public void setResult (TObject[] result) {//code} public TObject[] getResult () {//code} public boolean getOk (){//code} }

Así que asumí en mi clase que " result" es una matriz de TObject s. ¿Ahora que puedo hacer? Está usando @JsonProperty("result") para dos campos, uno es una matriz de TObject s y el otro es TObject OK?

Si no, ¿qué más puedo hacer?


Si habilita DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY ambos

{"result": []} y

{"result": {}} se puede analizar como

class Result{ List result; }

Enlace de documentación

Característica que determina si es aceptable forzar valores que no sean de matriz (en JSON) para que funcionen con los tipos de colección Java (arrays, java.util.Collection). Si está habilitado, los deserializadores de colección tratarán de manejar valores que no sean de matriz como si tuvieran una matriz JSON circundante "implícita". Esta función está destinada a ser utilizada por razones de compatibilidad / interoperabilidad, para trabajar con paquetes (como convertidores XML a JSON) que dejan fuera la matriz JSON en los casos en que solo hay un elemento en la matriz. La función está deshabilitada de manera predeterminada.

Demostración de cómo usarlo para entradas de OP jsons y POJOs:

ObjectMapper mapper = new ObjectMapper() mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); Result result = mapper.readValue(Result.class;

Se puede usar con @JsonFormat sobre clase o campo si no te gusta la versión del mapeador por alguna razón

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

PD. Otras preguntas sobre SO sobre este problema: LINK