Jackson-Serialisierung: leere Werte ignorieren (oder null)
Ich bin derzeit mit jackson 2.1.4 und ich habe einige Schwierigkeiten zu ignorieren Felder, wenn ich die Umwandlung eines Objekts zu einem JSON-string.
Hier ist meine Klasse, die als Objekt konvertiert werden:
public class JsonOperation {
public static class Request {
@JsonInclude(Include.NON_EMPTY)
String requestType;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
String username;
String email;
String password;
String birthday;
String coinsPackage;
String coins;
String transactionId;
boolean isLoggedIn;
}
}
public static class Response {
@JsonInclude(Include.NON_EMPTY)
String requestType = null;
Data data = new Data();
public static class Data {
@JsonInclude(Include.NON_EMPTY)
enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN };
enum Status { ok, error };
Status status;
ErrorCode errorCode;
String expiry;
int coins;
String email;
String birthday;
String pictureUrl;
ArrayList <Performer> performer;
}
}
}
Und hier ist, wie ich es konvertieren:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
JsonOperation subscribe = new JsonOperation();
subscribe.request.requestType = "login";
subscribe.request.data.username = "Vincent";
subscribe.request.data.password = "test";
Writer strWriter = new StringWriter();
try {
mapper.writeValue(strWriter, subscribe.request);
} catch (JsonGenerationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("JSON", strWriter.toString())
Hier ist die Ausgabe:
{"data":{"birthday":null,"coins":null,"coinsPackage":null,"email":null,"username":"Vincent","password":"test","transactionId":null,"isLoggedIn":false},"requestType":"login"}
Wie kann ich vermeiden, dass diejenigen, die null-Werte? Ich will nur zu nehmen erforderliche Informationen für das "Abonnement" Zweck!
Hier ist genau die Ausgabe, die ich bin auf der Suche nach:
{"data":{"username":"Vincent","password":"test"},"requestType":"login"}
Habe ich auch versucht @JsonInclude(Inkl.NON_NULL) und alle meine Variablen zu null, aber es hat nicht funktioniert! Danke für Eure Hilfe Jungs!
InformationsquelleAutor der Frage Shinnyx | 2013-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie die annotation an der falschen Stelle - es muss auf die Klasse, nicht auf dem Feld. ich.e:
Wie bereits angemerkt in den Kommentaren, in der version 2.x+ die syntax für diese Anmerkung ist:
Die andere option ist die Konfiguration des
ObjectMapper
direkt, einfach durch den Aufrufmapper.setSerializationInclusion(Include.NON_NULL);
(für das Protokoll, ich denke, dass die Popularität dieser Antwort ist ein Hinweis darauf, dass diese Anmerkung sollte anwendbar sein, die auf einer Feld-für-Feld-basis *ähem @fasterxml*)
InformationsquelleAutor der Antwort drewmoore
Zudem können Sie die Globale option:
InformationsquelleAutor der Antwort nomad
Sie können auch versuchen, zu verwenden
wenn Sie Umgang mit den jackson mit der version unten 2+ (1.9.5) getestet habe ich es, Sie können ganz einfach nutzen diese annotation über der Klasse. Nicht angegeben, die für die Attribute, die nur für die Klasse Unabhängigkeitserklärung.
InformationsquelleAutor der Antwort erhanasikoglu
Müssen Sie den import com.fasterxml.jackson.Anmerkung.JsonInclude;
Hinzufügen
oben auf POJO
Wenn Sie verschachtelte POJO dann
hinzufügen müssen auf alle Werte.
HINWEIS:
JAXRS (Jersey ) automatisch Griff dieses Szenario 2.6 und höher.
InformationsquelleAutor der Antwort vaquar khan
Jackson 2.x
@JsonInclude(JsonInclude.Gehören.NON_NULL) nur vor dem Feld.
InformationsquelleAutor der Antwort Gere
Ich hatte ähnliches problem vor kurzem mit der version 2.6.6.
Unter Verwendung der obigen Anmerkung entweder eingereicht oder Klasse wurde nicht wie erwartet. Die POJO war veränderlich, wo ich die Anwendung der annotation. Wenn ich änderte das Verhalten der POJO unveränderliche die annotation funktioniert seine Magie.
Ich bin nicht sicher, ob es nach unten auf die neue version oder früheren Versionen der lib hatten ein ähnliches Verhalten, sondern für 2.6.6 sicherlich müssen Sie Unveränderlich POJO für die annotation zu arbeiten.
Oben erwähnte Möglichkeit in verschiedenen Antworten der Einstellung serialisieren Aufnahme in ObjectMapper direkt auf globaler Ebene funktioniert, wie gut, aber ich bevorzuge die Steuerung es in der Klasse oder eingereicht Ebene.
Also, wenn Sie wollten, dass all die null-Felder werden ignoriert, während JSON serialisieren, dann verwenden Sie die annotation auf Klassen-Niveau, aber wenn Sie möchten, dass nur wenige Felder, ignoriert, in eine Klasse, dann verwenden Sie über die spezifischen Felder. Dadurch wird es besser lesbar ist & einfach für Wartungs -, wenn Sie wollten, um Verhalten zu ändern, für bestimmte Reaktionen aus.
InformationsquelleAutor der Antwort Amrut
Oder verwenden Sie GSON [https://code.google.com/p/google-gson/], wo diese null-Felder werden automatisch entfernt.
SampleDTO.java
Test.java
AUSGABE:
Ich verwendet gson-2.2.4
InformationsquelleAutor der Antwort anij
Code Balg kann helfen, wenn Sie ausschließen möchten, boolean Typ aus Serialisierung entweder:
InformationsquelleAutor der Antwort Alexander