json jackson内部集合反序列化为LinkedHashMap而不是MyObject

时间:2016-12-14 15:18:06

标签: java json collections jackson

我有以下对象结构,我无法对其进行任何修改(这是一个库,我没有源代码):

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的List而不是Bar的List。我已经在stackoverflow上查看了关于这个主题的所有其他帖子,但每次,列表都在顶层,所以很容易。我尝试使用mixin但没有成功,我尝试使用enableDefaultTyping但是我收到了错误...

我该怎么做?我重复我不能修改类文件,添加注释,添加中间对象,......一切都在库中。

编辑2016年12月12日: 我尝试使用Mixin:

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)......

1 个答案:

答案 0 :(得分:0)

即使您不控制库代码,您仍然可以使用混合注释:

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

这是要走的路。这里的一种可能性是“混入”:

@JsonDeserialize(contentAs=Bar.class)

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