JSON杰克逊内收集反序列化作为LinkedHashMap的,而不是为MyObject
问题描述:
我有以下对象结构,其上我不能做任何修改(这是一个图书馆和我没有源):JSON杰克逊内收集反序列化作为LinkedHashMap的,而不是为MyObject
class Foo {
List bars; // with no generics (but this is a List<Bar>)
Baz baz;
}
class Bar {
Fiz fiz;
Buz buz;
}
class Baz {
int toto;
}
class Fiz {
String titi;
}
class Buz {
String tata;
}
而下面的JSON:
{
"bars" : [
{
"fiz" : {
"titi" : "Hello"
},
"buz" : {
"tata" : "World"
}
},
{
"fiz" : {
"titi" : "Hola"
},
"buz" : {
"tata" : "El Mundo"
}
}
],
"baz" : {
"toto" : 42
}
}
我尝试用下面的代码反序列化JSON的:
ObjectMapper mapper = new ObjectMapper();
// ... use the visibilityChecker because objects are immutable (no setter)
mapper.readValue(json, Foo.class);
我检索LinkedHashMap列表而不是列表栏。我已经在*上检查了所有其他帖子上的帖子,但是每次列表都在顶层,所以它很容易。我试图用mixin没有成功,我试着用enableDefaultTyping,但我得到一个错误...
我该怎么做?我再说一遍,我无法修改类文件,添加注释,添加中介对象,......一切都在一个库中。
编辑21/12/2016: 我试图与密新:
abstract class FooMixin {
@JsonProperty("bars")
@JsonDeserialize(contentAs = Bar.class)
List bars;
}
abstract class BarMixin {
@JsonProperty("fiz") Fiz fiz;
@JsonProperty("buz") Buz buz;
}
mapper.addMixin(Foo.class, FooMixin.class);
mapper.addMixin(Bar.class, BarMixin.class);
但得到了同样的结果(LinkedHashMap的)...
答
即使你不控制库中的代码,你仍然可以使用混合式注解:
http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html
这是要走的路。这里的一个可能性是“在混合”:
@JsonDeserialize(contentAs=Bar.class)
以增强型信息;这需要在用于分配它的List
-valued字段或setter方法之前。
我试着用mixin,看我的编辑。它不工作太多......也许我错过了它。 –