我对 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”实例?我已经尝试在类“A”构造函数中为 Foo 参数使用 @JsonUnwrapped 属性,但它在多参数构造函数中不受支持,因为它需要 JsonProperty 才能工作(这没有意义,因为实际上没有这些项目的单一属性)。相反,序列化可以完美地使用这种模式。
它也可以通过使用单独的设置器与非不可变类一起使用,但我想知道是否有办法通过仅使用构造函数(或生成器,这在现实中是有意义的)来做同样的事情比示例中的要多得多)。
同样的方法显然适用于从“Foo”继承的“B”类。
提前致谢。