Am nevoie pentru a converti un anumit șir JSON de la un obiect Java. Eu sunt, folosind Jackson pentru JSON manipulare. Nu am nici un control asupra intrare JSON (am citit de la un serviciu web). Acest lucru este meu de intrare JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Aici este o utilizare simplificată caz:
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);
}
Mea clasa entitate este:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Înveliș mea de clasa este de fapt un obiect container pentru a obține lista mea de elevi:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Tot primesc aceasta eroare si "înveliș" revine null
. Nu sunt sigur ce's lipsă. Poate ajuta cineva va rog?
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)
Puteți utiliza Jackson's class-nivel adnotare:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Acesta va ignora toate proprietățile pe care le am't definite în POJO. Foarte util atunci când sunteți în căutarea doar pentru o pereche de proprietăți în JSON și don't vreau să scriu tot de cartografiere. Mai multe informatii la Jackson's site-ul. Dacă doriți să ignorați orice non declarate proprietate, ar trebui să scrie:
@JsonIgnoreProperties(ignoreUnknown = true)
Primul răspuns este aproape corect, dar ceea ce este nevoie pentru a schimba metoda getter, NU domeniu-domeniul privat (și nu auto-detectat); în continuare, getters au prioritate peste câmpuri, dacă ambele sunt vizibile.(Există modalități de a face privată câmpuri vizibile, dar dacă doriți să aveți getter acolo's nu mai are rost)
Deci getter ar trebui să fie numit getWrapper()
, sau adnotate cu:
@JsonProperty("wrapper")
Dacă preferați metoda getter numele așa cum este.
folosind Jackson 2.6.0, aceasta a lucrat pentru mine:
private static final ObjectMapper objectMapper =
new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
și cu setare:
@JsonIgnoreProperties(ignoreUnknown = true)
acesta poate fi realizat în 2 moduri:
@JsonIgnoreProperties(ignoreUnknown = true)
ObjectMapper mapper =new ObjectMapper(); // pentru Jackson versiunea 1.X mapper.configura(DeserializationConfig.Caracteristică.FAIL_ON_UNKNOWN_PROPERTIES, false); // pentru Jackson versiunea 2.X mapper.configura(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
Asta doar perfect lucrat pentru mine
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
@JsonIgnoreProperties(ignoreUnknown = true)
adnotare nu.
Aceasta funcționează mai bine decât Toate, vă rugăm să consultați această proprietate.
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
projectVO = objectMapper.readValue(yourjsonstring, Test.class);
Conform doc puteți ignora domeniile selectate sau toate necunoscut domenii:
// to prevent specified fields from being serialized or deserialized
// (i.e. not include in JSON output; or being set even if they were included)
@JsonIgnoreProperties({ "internalId", "secretKey" })
// To ignore any unknown properties in JSON input without exception:
@JsonIgnoreProperties(ignoreUnknown=true)
Jackson se plângă de faptul că se poate't găsi un câmp din clasa Wrapper care's a numit "înveliș". L's fac acest lucru pentru că JSON obiect are o proprietate numita "înveliș".
Cred că fix este de a redenumi clasa Wrapper's teren pentru a "înveliș" în loc de "elevii".
Am incercat metodele de mai jos și funcționează, pentru un astfel de format JSON lectură cu Jackson.
Folosesc deja solutia sugerata de: adnotarea getter cu @JsonProperty("înveliș")
Ambalajul clasa
public Class Wrapper{
private List<Student> students;
//getters & setters here
}
Sugestia mea de clasa wrapper
public Class Wrapper{
private StudentHelper students;
//getters & setters here
// Annotate getter
@JsonProperty("wrapper")
StudentHelper getStudents() {
return students;
}
}
public class StudentHelper {
@JsonProperty("Student")
public List<Student> students;
//CTOR, getters and setters
//NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}
Acest lucru ar oferi de ieșire de format:
{"wrapper":{"student":[{"id":13,"name":Fred}]}}
De asemenea pentru mai multe informații, consultați https://github.com/FasterXML/jackson-annotations
Sper că acest lucru vă ajută
Această soluție este generic, atunci când citesc json fluxuri și nevoie pentru a obține doar în unele domenii, în timp ce domeniile care nu sunt mapate corect în Domeniu Clase pot fi ignorate:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
O soluție ar fi să se utilizeze un instrument cum ar fi jsonschema2pojo de auto-genera necesare Domeniu Clase, cum ar fi Student la Schema de Răspuns json. Puteți face aceasta prin orice online json pentru schema convertorului.
Adnota domeniul elevii de mai jos deoarece nu există nepotrivire în numele json proprietate și java proprietate
public Class Wrapper {
@JsonProperty("wrapper")
private List<Student> students;
//getters & setters here
}
Ca nimeni altcineva nu a menționat-o, a crezut că mi-ar...
Problema este proprietatea ta în JSON este numit "înveliș" și proprietatea dumneavoastră în Wrapper.class este numit "elevii".
Deci, fie...
Fie Schimba
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
pentru a
public Class Wrapper {
private List<Student> wrapper;
//getters & setters here
}
---- sau ----
Schimba JSON string la
{"students":[{"id":"13","name":"Fred"}]}
Dvs. de intrare
{"wrapper":[{"id":"13","name":"Fred"}]}
indică faptul că acesta este un Obiect cu un câmp numit "înveliș", care este o Colecție de Elevi. Deci recomandarea mea ar fi,
Wrapper = mapper.readValue(jsonStr , Wrapper.class);
unde Ambalajul
este definit ca
class Wrapper {
List<Student> wrapper;
}
Noua Firebase Android a introdus unele schimbări uriașe ; mai jos o copie a doc :
[https://firebase.google.com/support/guides/firebase-android] :
Actualizați Java model de obiecte
Ca cu 2.x SDK, Baza de Date va converti automat Java obiecte pe care le trece la DatabaseReference.setValue()
în JSON și poate citi JSON în obiecte Java folosind DataSnapshot.getValue()
.
În noul SDK, atunci când citesc JSON într-un obiect Java cu DataSnapshot.getValue(), proprietăți necunoscute în JSON sunt acum ignorate în mod implicit, astfel încât să nu mai aveți nevoie de
@JsonIgnoreExtraProperties(ignoreUnknown=true)`.
Pentru a exclude domenii/getters atunci când scrieți un obiect Java pentru JSON, adnotarea este numit acum @Exclude "în loc de" @JsonIgnore
.
BEFORE
@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
public String name;
public String message;
@JsonIgnore
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
AFTER
public class ChatMessage {
public String name;
public String message;
@Exclude
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
Dacă există o proprietate în plus în JSON, care nu este în clasă Java, veți vedea acest avertisment în fișierele jurnal:
W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage
Puteți scăpa de acest avertisment de a pune o @IgnoreExtraProperties
adnotare pe clasa ta. Dacă doriți Baza de Date să se comporte așa cum a făcut în 2.x SDK și aruncă o excepție dacă există proprietăți necunoscute, puteți pune un @ThrowOnExtraProperties
adnotare pe clasa ta.