Java 如何向Jackson反序列化程序提供类型提示?

Java 如何向Jackson反序列化程序提供类型提示?,java,jackson,Java,Jackson,我使用Jackson作为一种工具来声明一些我无法注释(或修改)其类的对象。其中一个类具有非类型化列表的setter和getter。以下是经过消毒的版本: public class Family { private List members; public List getMembers() { return members; } public void setMembers(List members) { this.members = members; } //.

我使用Jackson作为一种工具来声明一些我无法注释(或修改)其类的对象。其中一个类具有非类型化列表的setter和getter。以下是经过消毒的版本:

public class Family {
    private List members;
    public List getMembers() { return members; }
    public void setMembers(List members) { this.members = members; }
    //...many, many other properties
}

public class Member {
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}
以下是我试图反序列化的JSON:

{ "members" : [ { "name" : "Mark" } ] }
我将使用的简单代码如下:

ObjectMapper mapper = new ObjectMapper();
Family family = mapper.readValue(json, Family.class);
Member member = (Member) family.getMembers().get(0);
System.out.println(member.getName());
但这当然失败了,因为Jackson不知道创建一个
成员列表,而不是它的后备列表,一个
LinkedHashMap
s列表

指示Jackson将
成员
视为
列表
的最简单方法是什么?
我不想为类使用完全自定义的反序列化程序,因为Jackson可以很好地处理许多其他属性

以下是使用BeanDeserializerModifier我能想到的最好方法:

mapper.setDeserializerProvider(new StdDeserializerProvider()
  .withDeserializerModifier(new BeanDeserializerModifier() {
      @Override
      public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BasicBeanDescription beanDesc, BeanDeserializerBuilder builder) {
          if (beanDesc.getBeanClass() == Family.class) {
            CollectionType type = CollectionType.construct(ArrayList.class, SimpleType.construct(Member.class));
            TypeDeserializer typeDeserializer = type.getTypeHandler();
            SettableBeanProperty.MethodProperty membersProperty = (SettableBeanProperty.MethodProperty) builder.removeProperty("members");
            builder.addProperty(new SettableBeanProperty.MethodProperty(
               "members",
               type,
               typeDeserializer,
               beanDesc.getClassAnnotations(),
               (AnnotatedMethod) membersProperty.getMember()
            ));
          }
          return builder;
      }}));
它是有效的,但对于我正在尝试做的事情来说,它看起来真的很低(而且冗长!)。我错过了什么

编辑 我应该注意,我使用的是Jackson 1.8.2,但如果有令人信服的理由,可以进行更新。

是我遗漏的难题中的关键部分。这里有一个更干净的方法来解决这个问题:

ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Family.class, FamilyMixin.class);

Family family = mapper.readValue(json, Family.class);
Member member = (Member) family.getMembers().get(0);

//...

interface FamilyMixin {
    @JsonDeserialize(contentAs = Member.class)
    void setMembers(List members);
}
混合注释允许您对您控制的代理进行注释。当混合类应用于真实类时,Jackson的行为就好像那些注释注释了真实类的成员一样


在我的例子中,我使用
JsonDeserialize.contentAs()
来指定容器的内容类型。但我相信大多数注释都应该使用这种方法。

打开了你的问题,但被宽泛的标题误导了。可以用一个更具体的标题来描述它吗,比如:如何指示Jackson将列表中的元素反序列化为