Wie kann ich ein assoziiertes Objekt mithilfe von Jackson und Anmerkungen unterschiedlich serialisieren?

8

Angesichts der folgenden Klassenhierarchie möchte ich, dass Foo in Abhängigkeit vom Kontext, der in meiner Klassenhierarchie verwendet wird, unterschiedlich serialisiert wird.

%Vor%

Ich möchte, dass das biz-Attribut nicht in fooB angezeigt wird, wenn ich FooContainer serialisiere. So würde die Ausgabe ungefähr wie folgt aussehen.

%Vor%

Ich wollte etwas JsonView verwenden, aber das muss auf dem Mapper-Layer für alle Instanzen einer Klasse angewendet werden, und das ist kontextabhängig.

Auf der Jackson-Mailingliste hat Tatu die einfachste Lösung (funktioniert in 2.0), die ich wahrscheinlich am Ende benutzen werde. Das Kopfgeld an jlabedo vergeben, weil die Antwort ein großartiges Beispiel dafür ist, wie man Jackson mit benutzerdefinierten Anmerkungen erweitern kann.

%Vor%     
Ransom Briggs 01.10.2012, 15:25
quelle

3 Antworten

8

Sie könnten eine Kombination aus einem benutzerdefinierten Serializer mit einem benutzerdefinierten Eigenschaftenfilter mit JsonViews verwenden. Hier ist ein Code, der mit Jackson 2.0 arbeitet.

Definieren Sie eine benutzerdefinierte Anmerkung:

%Vor%

Definieren Sie einige Ansichten:

%Vor%

Dann kannst du deine Entitäten so schreiben. Beachten Sie, dass Sie anstelle von @JsonView :

eine eigene Anmerkung definieren können %Vor%

Dann, hier ist, wo der Code beginnt :) Zuerst dein benutzerdefinierter Filter:

%Vor%

Dann eine benutzerdefinierte AnnotationIntrospector , die zwei Dinge tun wird:

  1. Aktivieren Sie Ihren benutzerdefinierten Filter für jede Bean ... Es sei denn, ein anderer Filter ist in Ihrer Klasse definiert (Sie können also nicht beide verwenden, wenn Sie sehen, was ich meine)
  2. Aktivieren Sie Ihren CustomSerializer, wenn er eine @FilterUsingView -Anmerkung gefunden hat.

Hier ist der Code

%Vor%

Hier ist Ihr benutzerdefinierter Serializer. Das einzige, was es tut, ist, den Wert Ihrer Anmerkung an Ihren benutzerdefinierten Filter zu übergeben, dann lässt der Standard-Serializer den Job erledigen.

%Vor%

Endlich! Lassen Sie uns das zusammenfassen:

%Vor%     
jlabedo 06.10.2012, 15:30
quelle
0
%Vor%

Verwenden von @JsonSerialize (using = FooCustomSerializer.class) auf dem öffentlichen Foo fooB; Feld.

Ссылка

    
Fireblaze 04.10.2012 16:21
quelle
0

Ich würde den Google-Code gson verwenden Dokumentation hier Ссылка Maven-Abhängigkeit ist:

%Vor%

Die Anmerkungen sind wie folgt:
Um den Feldbenutzer die @Expose Annotation
verfügbar zu machen Um einen speziellen Namen für das Feld im analysierten json-Benutzer zu generieren, verwenden Sie die @SerializedName("fieldNameInJSON") -Anmerkung
So würden Ihre Klassen so aussehen:

%Vor%

Um zu JSON zu serialisieren, verwenden Sie einen Code, der folgendermaßen aussieht:

%Vor%

Das würde beispielsweise für Listen aussehen:

%Vor%     
Mr T. 06.10.2012 15:47
quelle

Tags und Links