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;
}
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