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%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
:
Dann, hier ist, wo der Code beginnt :) Zuerst dein benutzerdefinierter Filter:
%Vor% Dann eine benutzerdefinierte AnnotationIntrospector
, die zwei Dinge tun wird:
@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%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:
Um zu JSON zu serialisieren, verwenden Sie einen Code, der folgendermaßen aussieht:
%Vor%Das würde beispielsweise für Listen aussehen:
%Vor%