Jackson mapping Oggetto o elenco di oggetti a seconda dell'ingresso json

Ho questo POJO:

public class JsonObj { private String id; private List<Location> location; public String getId() { return id; } public List<Location> getLocation() { return location; } @JsonSetter("location") public void setLocation(){ List<Location> list = new ArrayList<Location>(); if(location instanceof Location){ list.add((Location) location); location = list; } } } 

l'object "posizione" dall'input json può essere un'istanza semplice di Location o di un Array of Location. Quando è una sola istanza, ottengo questo errore:

  • Come rifiutare una chiamata in modo programmato android
  • com.google.ads.AdView non è riuscito ad istanziare
  • Come aprire il sottomenu dopo aver fatto clic sul menu-elemento nel cassetto di navigazione?
  • Instantizzare gli oggetti principali di Volley
  • Visualizzare l'image dai problemi di URL e di orientamento dello schermo
  • Problema di visualizzazione di ViewPager & ImageView
  •  Could not read JSON: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 

    Ho cercato di implementare un setter personalizzato ma non funzionava. Come posso fare per mappare una posizione o una list a seconda dell'ingresso json?

  • Visualizzazione di emoticon in Android
  • Lancio di dialogo "Imansible aggiungere la window - il token null non è per un'applicazione" con getApplication () come context
  • Come rilevare caratteri speciali in un text di modifica e visualizzare un Toast in risposta (Android)?
  • Come animare la catena in android alla stessa vista?
  • Crea il layout con il button AndroidView CardView e l'azione di galleggiamento
  • aggiungere la piccola image della filigrana alla grande image opencv4android
  • 2 Solutions collect form web for “Jackson mapping Oggetto o elenco di oggetti a seconda dell'ingresso json”

    Aggiornamento: l'anima mentale di Mher Sarkissian funziona bene, può anche essere utilizzato con le annotazioni come suggerito qui , come così :.

     @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List<Item> item; 

    Le mie simpatie più profonde per questo problema più fastidioso, ho avuto lo stesso problema e ho trovato la soluzione qui: https://stackoverflow.com/a/22956168/1020871

    Con una piccola modifica mi presento, innanzitutto la class generica:

     public abstract class OptionalArrayDeserializer<T> extends JsonDeserializer<List<T>> { private final Class<T> clazz; public OptionalArrayDeserializer(Class<T> clazz) { this.clazz = clazz; } @Override public List<T> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { ObjectCodec oc = jp.getCodec(); JsonNode node = oc.readTree(jp); ArrayList<T> list = new ArrayList<>(); if (node.isArray()) { for (JsonNode elementNode : node) { list.add(oc.treeToValue(elementNode, clazz)); } } else { list.add(oc.treeToValue(node, clazz)); } return list; } } 

    E poi la properties; e l'attuale class di deserializzatore (i generici Java non sono sempre carini):

     @JsonDeserialize(using = ItemListDeserializer.class) private List<Item> item; public static class ItemListDeserializer extends OptionalArrayDeserializer<Item> { protected ItemListDeserializer() { super(Item.class); } } 

    Questo è già supportto da jackson

     objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.