Ik moet een bepaalde JSON string converteren naar een Java object. Ik gebruik Jackson voor JSON handling. Ik heb geen controle over de input JSON (ik lees van een web service). Dit is mijn input JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Hier is een vereenvoudigde use case:
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);
}
Mijn entiteit klasse is:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Mijn Wrapper klasse is eigenlijk een container object om mijn lijst van studenten te krijgen:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Ik krijg steeds deze foutmelding en "wrapper" geeft null
terug. Ik weet niet zeker wat'er mist. Kan iemand me alsjeblieft helpen?
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)
U kunt Jackson's annotatie op klassenniveau gebruiken:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Het zal elke eigenschap negeren die je'niet in je POJO hebt gedefinieerd. Heel handig als je maar een paar eigenschappen in de JSON zoekt en niet de hele mapping wilt schrijven. Meer info op Jackson's website. Als je een niet gedeclareerde eigenschap wilt negeren, moet je schrijven:
@JsonIgnoreProperties(ignoreUnknown = true)
Het eerste antwoord is bijna juist, maar wat nodig is, is om de getter methode te veranderen, NIET het veld -- het veld is privaat (en wordt niet automatisch gedetecteerd); verder hebben getters voorrang op velden als beide zichtbaar zijn.(Er zijn manieren om private velden ook zichtbaar te maken, maar als je een getter wilt hebben, heeft het niet veel zin)
Dus getter moet of getWrapper()
heten, of geannoteerd worden met:
@JsonProperty("wrapper")
Als je de voorkeur geeft aan de getter methode naam zoals die is.
Jackson klaagt omdat het geen veld in je klasse Wrapper kan vinden dat "wrapper" heet. Het doet dit omdat je JSON object een eigenschap heeft genaamd "wrapper".
Ik denk dat de oplossing is om je Wrapper klasse's veld te hernoemen naar "wrapper" in plaats van "students".