Ich verwende derzeit Jackson 2.1.4 und habe Probleme, Felder zu ignorieren, wenn ich ein Objekt in eine JSON-Zeichenfolge konvertiere.
Hier ist meine Klasse, die als zu konvertierendes Objekt fungiert:
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 so konvertiere ich es:
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 diese Nullwerte vermeiden? Ich möchte die erforderlichen Informationen nur für den "Abonnement" -Zweck verwenden!
Hier ist genau die Ausgabe, die ich suche:
{"data":{"username":"Vincent","password":"test"},"requestType":"login"}
Ich habe auch @JsonInclude (Include.NON_NULL) ausprobiert und alle meine Variablen auf null gesetzt, aber es hat auch nicht funktioniert! Vielen Dank für Ihre Hilfe Jungs!
Antworten:
Sie haben die Anmerkung an der falschen Stelle - sie muss sich in der Klasse befinden, nicht auf dem Feld. dh:
Wie in den Kommentaren erwähnt, lautet die Syntax für diese Anmerkung in Versionen unter 2.x:
Die andere Möglichkeit besteht darin, das
ObjectMapper
direkt zu konfigurieren , indem Sie einfach aufrufenmapper.setSerializationInclusion(Include.NON_NULL);
(Ich denke, die Popularität dieser Antwort ist ein Hinweis darauf, dass diese Anmerkung feldweise anwendbar sein sollte , @fasterxml)
quelle
@JsonInclude(JsonSerialize.Inclusion.NON_NULL)
sollte sein@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
und es ist auch der alte veraltete Weg. Sie sollten also "in Version unter 2.x"@JsonInclude(Include.NON_NULL)
Sie können auch die globale Option festlegen:
quelle
Sie können auch versuchen, zu verwenden
Wenn Sie es mit Jackson mit einer Version unter 2+ (1.9.5) zu tun haben, die ich getestet habe, können Sie diese Anmerkung leicht über der Klasse verwenden. Nicht für die Attribute angegeben, nur für die Klassendekleration.
quelle
Sie müssen hinzufügen
import com.fasterxml.jackson.annotation.JsonInclude;
Hinzufügen
auf POJO
Wenn Sie POJO dann verschachtelt haben
müssen alle Werte hinzufügen.
HINWEIS: JAXRS (Jersey) behandelt dieses Szenario ab Version 2.6 automatisch.
quelle
Für Jackson 2.x.
kurz vor dem Feld.
quelle
Ich hatte kürzlich ein ähnliches Problem mit Version 2.6.6.
Die Verwendung der obigen Anmerkung auf Datei- oder Klassenebene funktionierte nicht wie erwartet. Das POJO war veränderlich, wo ich die Anmerkung anwendete. Als ich das Verhalten des POJO so änderte, dass es unveränderlich war, wirkte die Anmerkung magisch.
Ich bin nicht sicher, ob es sich um eine neue Version oder frühere Versionen dieser Bibliothek handelt, aber für 2.6.6 benötigen Sie sicherlich unveränderliches POJO, damit die Anmerkung funktioniert.
Die oben in verschiedenen Antworten erwähnte Option zum Festlegen der Serialisierungseinbeziehung in ObjectMapper direkt auf globaler Ebene funktioniert ebenfalls, ich bevorzuge jedoch die Steuerung auf Klassen- oder Ablageebene.
Wenn Sie also möchten, dass alle Nullfelder während der JSON-Serialisierung ignoriert werden, verwenden Sie die Annotation auf Klassenebene. Wenn Sie jedoch möchten, dass nur wenige Felder in einer Klasse ignoriert werden, verwenden Sie sie über diesen bestimmten Feldern. Auf diese Weise ist es besser lesbar und einfach zu warten, wenn Sie das Verhalten für eine bestimmte Reaktion ändern möchten.
quelle
Sie können auch GSON [ https://code.google.com/p/google-gson/ ] verwenden, bei dem diese Nullfelder automatisch entfernt werden.
SampleDTO.java
Test.java
AUSGABE:
Ich habe gson-2.2.4 verwendet
quelle
Der folgende Code kann hilfreich sein, wenn Sie den booleschen Typ von der Serialisierung ausschließen möchten:
quelle