【问题标题】:json jackson inner collection deserialize as LinkedHashMap instead of MyObjectjson jackson 内部集合反序列化为 LinkedHashMap 而不是 MyObject
【发布时间】:2017-04-29 23:41:39
【问题描述】:

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

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 列表而不是 Bar 列表。我已经在 stackoverflow 上查看了有关该主题的所有其他帖子,但每次列表都位于顶层,因此非常简单。我尝试使用 mixin 没有成功,我尝试使用 enableDefaultTyping 但出现错误...

我该怎么做?我再说一遍,我无法修改类文件、添加注释、添加中间对象……一切都在库中。

编辑 21/12/2016 : 我用 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)...

【问题讨论】:

标签: java json collections jackson


【解决方案1】:

即使你不控制库代码,你仍然可以使用混入注解:

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

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

@JsonDeserialize(contentAs=Bar.class)

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

【讨论】:

  • 我尝试过使用 mixin,请参阅我的编辑。它不起作用...也许我误用了它。
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多