我对Jackson库(版本1.9)很陌生。我仅在几个星期后才使用它,并且我发现它非常灵活并且节省时间,因为它是关于在Java中对对象进行序列化和反序列化的。使用Jackson的不可变类反序列化JSON平面对象
但是,我遇到了麻烦,但是,将“扁平”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" }
的问题是:是否有一个基于注释的方式(这样,而不需要使用自定义的反序列化器)告诉Jackson将给定的JSON组合成一个'A'实例? 我已经尝试在类'A'构造函数中为Foo参数使用@JsonUnwrapped属性,但它在多参数构造函数中不受支持,因为它需要JsonProperty才能工作(这没有意义,因为实际上这些项目没有单独的财产)。相反,序列化可以完美地使用这种模式。
它还将与非不变类使用单独制定者的工作,但我想知道是否有一种方法只用构造函数(或建造者做同样的,这将使意义,因为在实际情况远不止这个例子中的那个)。
非常相同的方法显然适用于继承自'Foo'的类'B'。
在此先感谢。
由于某些原因,你使用1.9而不是2+吗? – 2012-07-23 21:49:41
我已经开始使用与当前为1.9的google-http-java-client捆绑在一起的Jackson版本。4,然后我继续使用Jackson本身,而不是Google库的更高级可插入JSON解析器(它对注释的支持少得多)。 – fast3r 2012-07-24 08:32:32
无论如何,没有任何东西可以阻止我使用2.0版本,除了任何(据称)已知的问题。更重要的是,我对尝试使用Afterburner模块感到非常好奇,后者应该通过减少反射开销来加速JSON数据绑定[链接](http://www.cowtowncoder.com/blog/archives/2012/04 /entry_470.html) – fast3r 2012-07-24 08:38:35