Ich habe eine Struktur mit kreisförmigen Referenzen. Und für Debug-Zwecke möchte ich es dumpen. Grundsätzlich wie jedes Format, aber ich wählte JSON.
Da es jede Klasse sein kann, habe ich GSON gewählt, das keine JAXB-Annotationen benötigt.
Aber GSON trifft die Zirkelreferenzen und rekursiert bis StackOverflowError
.
Wie kann ich GSON auf
beschränken? bestimmte Klassenmitglieder ignorieren?
Sowohl @XmlTransient
als auch @JsonIgnore
werden nicht befolgt.
bestimmte Objekt-Graph-Pfade ignorieren? Z.B. Ich könnte GSON anweisen, release.customFields.product
nicht zu serialisieren.
Gehen Sie in die Tiefe von höchstens 2 Ebenen?
Einfach die Felder transient machen (wie in private transient int field = 4;
). GSON versteht das.
Bearbeiten
Keine integrierte Anmerkung erforderlich; Mit Gson können Sie Ihre eigenen Strategien zum Ausschließen von Feldern und Klassen einsetzen. Sie können nicht auf einem Pfad oder einer Verschachtelungsebene basieren, aber Anmerkungen und Namen sind in Ordnung.
Wenn ich Felder mit dem Namen "lastName" in der Klasse "my.model.Person" überspringen wollte, könnte ich eine Ausschlussstrategie wie folgt schreiben:
%Vor%Ich könnte auch meine eigene Anmerkung machen:
%Vor% Und schreiben Sie die Methode shouldSkipField
wie folgt um:
Dies würde es mir ermöglichen, Dinge wie:
zu tun %Vor%Um eine benutzerdefinierte ExclusionStrategy zu verwenden, erstellen Sie ein Gson-Objekt mit dem Builder:
%Vor%Ich weiß, dass diese Frage schon ein paar Jahre alt ist, aber ich möchte gerne zu meiner Lösung beitragen. Obwohl @ fdregers Antwort vollständig gültig ist, wenn Sie ein Feld immer ausschließen möchten, funktioniert es nicht, wenn Sie es nur in bestimmten Fällen ausschließen möchten, um auf diese Weise die Rekursion zu vermeiden. Die Art, wie ich das Problem ansprach, ist:
Ich schreibe mein eigenes JsonSerializer
. Darin definiere ich eine statische Variable, um zu steuern, wie oft ein Objekt derselben Klasse serialisiert wird, und abhängig vom Wert kann das Objekt serialisiert werden oder nicht.
Binden Sie UserJsonSerializer
an die Klasse, die Sie steuern möchten
Vergessen Sie nicht, die Methode UserJsonSerializer#clear()
aufzurufen, um den Zähler jedes Mal neu zu initialisieren, wenn Sie eine neue Entität parsen.
Ich hoffe, das hilft.
Tags und Links java json serialization gson