Ho bisogno di convertire una certa stringa JSON in un oggetto Java. Sto usando Jackson per la gestione di JSON. Non ho alcun controllo sull'input JSON (leggo da un servizio web). Questo è il mio input JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Ecco un caso d'uso semplificato:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
La mia classe di entità è:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
La mia classe Wrapper è fondamentalmente un oggetto contenitore per ottenere la mia lista di studenti:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Continuo a ricevere questo errore e "wrapper" restituisce null
. Non sono sicuro di cosa manchi. Qualcuno può aiutare per favore?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
Potete usare l'annotazione a livello di classe di Jackson:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Ignorerà ogni proprietà che non hai definito nel tuo POJO. Molto utile quando stai cercando solo un paio di proprietà nel JSON e non vuoi scrivere l'intera mappatura. Maggiori informazioni al sito web di Jackson. Se vuoi ignorare qualsiasi proprietà non dichiarata, dovresti scrivere:
@JsonIgnoreProperties(ignoreUnknown = true)
La prima risposta è quasi corretta, ma ciò che è necessario è cambiare il metodo getter, NON il campo -- il campo è privato (e non viene rilevato automaticamente); inoltre, i getter hanno la precedenza sui campi se entrambi sono visibili (ci sono modi per rendere visibili anche i campi privati, ma se vuoi avere i getter non ha molto senso)
Quindi il getter dovrebbe essere chiamato getWrapper()
, o annotato con:
@JsonProperty("wrapper")
Se preferite il nome del metodo getter così com'è.
Jackson si lamenta perché non riesce a trovare un campo nella tua classe Wrapper che si chiama "wrapper". Lo sta facendo perché il tuo oggetto JSON ha una proprietà chiamata "wrapper".
Penso che la soluzione sia rinominare il campo della tua classe Wrapper in "wrapper" invece di "students".