Gson Serialisiert Feld nur, wenn nicht null ist oder nicht leer ist
Ich habe die Anforderung, wo ich konvertieren müssen java-Objekt zu json.
Ich bin mit Gson, aber ich brauche den Konverter nur zu serialisieren, die nicht null sind oder nicht leeren Werte.
Beispiel:
//my java object looks like
class TestObject{
String test1;
String test2;
OtherObject otherObject = new OtherObject();
}
nun meine Gson Instanz zu konvertieren, das Objekt zu json sieht wie
Gson gson = new Gson();
TestObject obj = new TestObject();
obj.test1 = "test1";
obj.test2 = "";
String jsonStr = gson.toJson(obj);
println jsonStr;
In der oben drucken, das Ergebnis ist
{"test1":"test1", "test2":"", "otherObject":{}}
Hier ich wollte nur das Ergebnis
{"test1":"test1"}
Seit der test2 ist leer und otherObject ist leer, ich will nicht, dass Sie serialisiert werden, um json-Daten.
Btw, ich bin mit Groovy/Grails also, wenn es ein plugin dazu wäre es gut, wenn nicht jeder Vorschlag zur Anpassung der gson-Serialisierung-Klasse wäre gut.
Woher weiß er das
otherObject
leer ist?InformationsquelleAutor zdesam | 2013-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie Ihre eigenen
TypeAdapter
Können Sie sich dann registrieren Sie es mit
Gson
.produziert
Den
GsonBuilder
Klasse hat eine Reihe von Methoden zum erstellen Ihrer eigenen Serialisierung/Deserialisierung Strategien, registrieren, Typ Adapter, und legen Sie die anderen Parameter.Strings
ist eine Guave Klasse. Sie können Ihre eigenen zu überprüfen, wenn Sie nicht möchten, dass Abhängigkeit.Sie tun das verschachtelte Serialisierung in dieser Klasse. Diese Klasse ist vollständig abhängig von Ihrer
TestObject
Klasse, so ist es am besten geeignet ist, zu tun alle seine Serialisierung/Deserialisierung. Keine andere Komponente kann überprüfen Sie die benutzerdefinierte Bedingungen, die Sie möchten.Mit solch weggelassen werden leere strings ordentlich in jeder Klasse, Ihre Lösung läuft darauf hinaus, tun alles manuell. Auch mit der Serialisierung werden alle Felder benötigen keine Besondere Behandlung. Es gibt nicht viel, was Gson nicht Links.
downvoted weil wenn elses' - mit Reflexionen der bessere Ansatz ist, ignorieren Sie die Notwendigkeit für T
Es ist nicht möglich, es zu tun mit Reflexion, rekursiv. Wie Sie beschreiben, dass
OtherObject
leer ist? Es hat keine Felder? Es hat keine Felder, die nicht leer (rekursiv mit den gleichen Regeln)? Es hat keine Felder, die null sind? Es hat keine Felder mit einem Standard-Wert? Das gilt für alle Pojo-Typen oder einfach nurOtherObject
? Mit eine Art adapter, Sie werden explizit für die Typen, für die du verantwortlich bist.InformationsquelleAutor Sotirios Delimanolis
Was ich persönlich nicht mag in
TypeAdapter
mithilfe Antwort-ist die Tatsache, dass Sie brauchen, um zu beschreiben, jedes Feld der ganzen Klasse haben könnte, können sagen, 50 Felder (also 50if
Blöcke inTypeAdapter
).Meine Lösung basiert auf
Reflection
und eine TatsacheGson
wird nicht serialisiert Felder null-Werte durch default.Ich habe eine Besondere Klasse, die hält Daten für API für die Erstellung von Dokument genannt DocumentModel, die hat über 50 Felder und ich weiß nicht, wie zu senden
String
Felder mit "" (leer, aber nicht null -) Werte oder leere arrays zu server. So habe ich eine spezielle Methode, die gibt mir eine Kopie des Objekts mit allen für leere Felder zurückgesetzt. Hinweis - standardmäßig sind alle arrays in meinem DocumentModel Instanz initialisiert werden als Leerstring (Länge null) - arrays-und damit sind Sie nie null sein kann, sollten Sie vielleicht überprüfen Sie Ihre arrays auf null, bevor Sie Ihre Länge.Mit dieser Methode ist mir egal, wenn einige Felder Hinzugefügt oder entfernt wurde, nachdem diese Methode geschrieben wurde oder was auch immer. Das einzige problem der linken ist die überprüfung von benutzerdefinierten Feldern, die nicht
String
oder ein array, aber das hängt insbesondere Klasse und sollte extra kodiert in if/else-Blöcke.InformationsquelleAutor Stan
Scheint es mir, das problem ist nicht mit gson. Gson richtig verfolgt, den Unterschied zwischen null und einem leeren string. Sind Sie sicher, dass Sie löschen wollen, die Unterscheidung? Sind Sie sicher, dass alle Klassen mit TestObject don ' T care?
Was Sie tun können, wenn Sie nicht kümmern, was der Unterschied ist, ändern Sie die leeren Saiten auf null innerhalb von ein Testobjekt vor dem serialisieren. Oder besser, machen die Setzer in Testobjekt so, dass ein leerer string, auf null festgelegt ist; auf diese Weise definieren Sie starr in die Klasse, die eine leere Zeichenfolge ist das gleiche wie null. Sie müssen sicherstellen, dass die Werte nicht festgelegt werden können, außerhalb der setter.
""
undnull
. Die saner Lösung ist vermutlich die Vermeidung vonnull
und mit""
nur. Andere Bibliotheken könnten die Arbeit besser mit leeren Zeichenfolgen als mit Nullen. Datenbanken durchsetzen können, NICHT NULL, aber Sie können nicht erzwingen "nicht leer". +++ Normalisierung auf null ist keine option für mich, da meine Objekte sind an dem Punkt, der immer noch an einer Hibernate-session.InformationsquelleAutor toto2