2016-12-14 89 views
0

我有以下对象结构,其上我不能做任何修改(这是一个图书馆和我没有源):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列表而不是列表栏。我已经在stackoverflow上检查了所有其他帖子上的帖子,但是每次列表都在顶层,所以它很容易。我试图用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的)...

回答

0

即使你不控制库中的代码,你仍然可以使用混合式注解:

http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

这是要走的路。这里的一个可能性是“在混合”:

@JsonDeserialize(contentAs=Bar.class)

以增强型信息;这需要在用于分配它的List -valued字段或setter方法之前。

+0

我试着用mixin,看我的编辑。它不工作太多......也许我错过了它。 –