Πρέπει να μετατρέψω ένα συγκεκριμένο αλφαριθμητικό JSON σε αντικείμενο Java. Χρησιμοποιώ το Jackson για το χειρισμό του JSON. Δεν έχω κανέναν έλεγχο του JSON εισόδου (διαβάζω από μια υπηρεσία ιστού). Αυτό είναι το JSON εισόδου μου:
{"wrapper":[{"id":"13","name":"Fred"}]}
Ακολουθεί μια απλοποιημένη περίπτωση χρήσης:
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);
}
Η κλάση οντότητάς μου είναι:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Η κλάση Wrapper μου είναι βασικά ένα αντικείμενο-δοχείο για να πάρω τη λίστα των μαθητών μου:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Συνεχίζω να λαμβάνω αυτό το σφάλμα και το "wrapper" επιστρέφει null
. Δεν είμαι σίγουρος τι λείπει. Μπορεί κάποιος να βοηθήσει παρακαλώ;
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)
Μπορείτε να χρησιμοποιήσετε τον σχολιασμό επιπέδου κλάσης του Jackson's:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Θα αγνοήσει κάθε ιδιότητα που δεν έχετε ορίσει στο POJO σας. Πολύ χρήσιμο όταν ψάχνετε μόνο για μερικές ιδιότητες στο JSON και δεν θέλετε να γράψετε ολόκληρη την αντιστοίχιση. Περισσότερες πληροφορίες στο Jackson's website. Αν θέλετε να αγνοήσετε οποιαδήποτε μη δηλωμένη ιδιότητα, θα πρέπει να γράψετε:
@JsonIgnoreProperties(ignoreUnknown = true)
Η πρώτη απάντηση είναι σχεδόν σωστή, αλλά αυτό που χρειάζεται είναι να αλλάξετε τη μέθοδο getter, ΟΧΙ το πεδίο -- το πεδίο είναι ιδιωτικό (και δεν ανιχνεύεται αυτόματα).Επιπλέον, οι getters έχουν προτεραιότητα έναντι των πεδίων αν και τα δύο είναι ορατά (υπάρχουν τρόποι να κάνετε ορατά και τα ιδιωτικά πεδία, αλλά αν θέλετε να έχετε getter δεν υπάρχει ιδιαίτερο νόημα).
Έτσι, ο getter θα πρέπει είτε να ονομάζεται getWrapper()
, είτε να σχολιάζεται με:
@JsonProperty("wrapper")
Αν προτιμάτε το όνομα της μεθόδου getter ως έχει.
Το Jackson διαμαρτύρεται επειδή δεν μπορεί να βρει ένα πεδίο στην κλάση Wrapper που ονομάζεται "wrapper". Το κάνει αυτό επειδή το αντικείμενό σας JSON έχει μια ιδιότητα που ονομάζεται "wrapper".
Νομίζω ότι η λύση είναι να μετονομάσετε το πεδίο της κλάσης Wrapper σε "wrapper" αντί για "students".