私はJacksonライブラリ(バージョン1.9)を初めて使用します。私はそれを数週間から使用していますが、Javaでオブジェクトをシリアル化および逆シリアル化する場合は、非常に柔軟で時間の節約になります。
ただし、両方が不変であることが意図されている場合、「フラットな」JSONを別のクラスの構成であるクラスに逆シリアル化する際に問題が発生しています。
私の状況はほとんど次のとおりです。
class Foo {
private final String var1;
Foo(String var1) {
this.var1 = var1;
}
// getters omitted
}
class A {
private final Foo foo;
private final String var2;
A(/* @JsonUnwrapped doesn't work here */ Foo foo, String var2) {
this.foo = foo;
this.var2 = var2;
}
@JsonUnwrapped
Foo getFoo() {
return foo;
}
String getVar2() {
return var2;
}
}
class B extends Foo {
private final String var2;
B(String var1, String var2) {
super(var1);
this.var2 = var2;
}
// getters omitted
}
そして、逆シリアル化するJSONは次のようなものです。
{ "var1" : "some_value", "var2" : "some_other_value" }
問題は、注釈ベースの方法(つまり、カスタムデシリアライザーを使用せずに)で、指定されたJSONを「A」インスタンスに作成するようにJacksonに指示する方法はありますか?クラス'A'コンストラクターのFoo引数に@JsonUnwrapped属性を使用しようとしましたが、動作するにはJsonPropertyが必要になるため、マルチ引数コンストラクターではサポートされていません(実際には存在しないため、意味がありません)それらのアイテムの単一のプロパティ)。代わりに、シリアル化はこのパターンを使用して完全に機能します。
個別のセッターを使用することで不変のクラスでも機能しますが、コンストラクター(またはビルダー、実際にはフィールドが例のものよりはるかに多い)。
まったく同じメソッドが、「Foo」から継承するクラス「B」で明らかに機能します。
前もって感謝します。