GSON: Wie kann StackOverflowError verhindert werden, während zirkuläre Referenzen beibehalten werden?

8

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?

Verwandte: Gson .toJson gibt StackOverFlowError, wie bekommt man in diesem Fall den richtigen json? (öffentliche statische Klasse)

    
Ondra Žižka 23.01.2013, 21:11
quelle

2 Antworten

18

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:

%Vor%

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%     
fdreger 23.01.2013 21:16
quelle
0

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:

  1. 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.

    %Vor%
  2. Binden Sie UserJsonSerializer an die Klasse, die Sie steuern möchten

    %Vor%
  3. 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.

    
Julio 28.11.2017 07:15
quelle

Tags und Links