Potrebujem previesť určitý reťazec JSON na objekt Java. Na spracovanie JSON používam Jackson. Nemám kontrolu nad vstupným JSON (čítam z webovej služby). Toto je môj vstupný JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Tu je zjednodušený prípad použitia:
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);
}
Moja trieda entity je:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Moja trieda Wrapper je v podstate kontajnerový objekt na získanie zoznamu študentov:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Stále dostávam túto chybu a "wrapper" vracia null
. Nie som si istý, čo mi chýba. Môže mi niekto pomôcť, prosím?
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)
Môžete použiť anotáciu na úrovni triedy Jackson's:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Bude ignorovať každú vlastnosť, ktorú ste'nedefinovali vo vašom POJO. Veľmi užitočné, keď hľadáte len pár vlastností v JSON a nechcete písať celé mapovanie. Viac informácií nájdete na Jacksonovej stránke. Ak chcete ignorovať akúkoľvek nedeklarovanú vlastnosť, mali by ste napísať:
@JsonIgnoreProperties(ignoreUnknown = true)
Prvá odpoveď je takmer správna, ale je potrebné zmeniť metódu getter, NIE pole -- pole je súkromné (a nie automaticky detekované); ďalej, gettery majú prednosť pred poľami, ak sú obidve viditeľné (existujú spôsoby, ako zviditeľniť aj súkromné polia, ale ak chcete mať getter, nemá to veľký zmysel).
Takže getter by mal byť buď pomenovaný getWrapper()
, alebo anotovaný pomocou:
@JsonProperty("wrapper")
Ak uprednostňujete názov metódy getter tak, ako je.
Jackson sa sťažuje, pretože nemôže nájsť pole vo vašej triede Wrapper, ktoré sa volá "wrapper". Robí to preto, lebo váš objekt JSON má vlastnosť s názvom "wrapper".
Myslím, že oprava spočíva v premenovaní poľa vašej triedy Wrapper'na "wrapper" namiesto "students".