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:

  • Android Studio non visualizza il dispositivo
  • Come risolvere per viewpager: Il figlio specificato ha già un genitore. Devi call removeView () sul genitore del figlio per prima cosa
  • Rimuovere un marcatore da un GoogleMap
  • Utilizzando Google Breakpad per Android NDK?
  • come salvare la vista come un'image alla scheda SD
  • come può realmente mostrare ProgressDialog mentre aspetta il process finale
  •  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?

  • Come utilizzare l'image (image memorizzata del dispositivo) con il text su TextView Android?
  • Interrompere il text di grandi size in pagine in switcher di text android o visualizzare il flipper
  • Applicazione Android che invia una string da visualizzare su una pagina web
  • Come posso riempire RecyclerView con GridLayoutManager da destra a sinistra
  • Errore durante l'esecuzione di "adb shell wm density 240" per la modifica della densità del dispositivo Android
  • Avvia Google Maps app
  • 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.