Ho una classe Java MyPojo
che mi interessa deserializzare da JSON. Ho configurato una speciale classe MixIn, MyPojoDeMixIn
, per aiutarmi con la deserializzazione. MyPojo
ha solo int
e String
variabili di istanza combinate con getter e setter appropriati. MyPojoDeMixIn
sembra qualcosa di simile:Deserializzare JSON in ArrayList <POJO> utilizzando Jackson
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
Nel mio client di prova che faccio quanto segue, ma naturalmente non funziona in fase di compilazione perché c'è un JsonMappingException
relativa a un tipo non corrispondente.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Sono consapevole che avrei potuto alleviare questo problema creando un oggetto "risposta" che ha solo un ArrayList<MyPojo>
in essa, ma poi avrei dovuto creare questi oggetti un po 'inutile per ogni singolo tipo voglio tornare .
Ho anche guardato in linea JacksonInFiveMinutes ma ho avuto un pessimo tempo a capire le cose su Map<A,B>
e come si riferisce al mio problema. Se non puoi dirlo, sono completamente nuovo in Java e provengo da uno sfondo Obj-C. Essi indicano in particolare:
Oltre al legame POJO e tipi "semplici", c'è un ulteriore variante: quella di legare ai contenitori generici (tipizzati). Questo caso richiede una gestione speciale a causa della cosiddetta Type Erasure (utilizzata da Java per implementare i generici in modo leggermente compatibile all'indietro ), che impedisce di utilizzare qualcosa come Collection.class (che non viene compilato).
Quindi, se si desidera associare i dati in una mappa è necessario utilizzare:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Come posso deserializzare direttamente a ArrayList
?
La risposta sembra essere correlata alla loro informazioni su come utilizzare il supporto integrato per 'TypeReference' - Io proprio non capisco come si fa ... Si prega di vedere la mia modifica sopra per le loro istruzioni su come usare i generici. –
Beh, è correlato. Ma questo è un frammento di codice in lavorazione in produzione. Dimentica il tuo mixin, usa solo il codice che ho mostrato (ma sostituisci POJO ovviamente con il nome della tua classe bean effettiva). – Perception
Il tuo codice è stato compilato, ma ottengo un'eccezione di run time durante il tentativo di stampare 'arrayList.toString()' su un 'NullPointerException'. Immagino che questo potrebbe essere dovuto al fatto che il mio 'POJO' non è conforme alle giuste convenzioni di denominazione per le sue proprietà, cioè, l'intero problema è che il servizio web restituisce' Prop1Member' e il mio oggetto ha 'Prop1'. Questa è l'unica vera ragione per cui sto usando i mixin, quindi non devo mettere le dichiarazioni per '@ JsonProperty' nei miei oggetti puri. –