getter返回的类型不同于Jackson中的字段类型。如何将地图转换为设置?

时间:2013-08-02 14:25:29

标签: java jackson

类:

public class Contact implements ContactInterface {
    private Set<ContactInfoInterface> contactInfo;

    public Map<String, ContactInfo> getContactInfo() {
        // create maps from contactInfo set
        return map;
    }
    //no setter
}

public class ContactInfo implements ContactInfoInterface {
    private String contactInfoValue;

    public String getContactInfoValue {
        return this.contactInfoValue;
    }
    public void setContactInfoValue(String value) {
        this.contactInfoValue = value;
    }
}

Jackson MixIn:

public abstract class ContactMixIn implements ContactInterface {

    @JsonProperty
    public abstract Map<String, ContactInfo> getContactInfo();
}

我对杰克逊创建的json反序列化有问题。在序列化的结果中,我得到了json,其中我有一个contactInfo作为一个map(这基本上就是我们在getter中作为返回类型所拥有的)。但是当我反序列化它时,杰克逊试图将contactInfo实例化为一个集合(这也是因为contactInfo是一个集合)。但当然Jackson无法将json值映射到set并发生奇怪的异常。所以我的问题是如何在这种情况下反序列化地图以获取ContactInfoInterface的集合?

它们不是第三部分类,因此我可以为它们添加setter或其他任何东西。但如果有一个选项,我宁愿不这样做。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

没有直接的方法可以将Set转换为MapSetCollection的扩展,Map是完全不同的对象。如果ContactInfoInterface包含手动构建 a Map所需的信息,则可以执行此操作。但是尝试以Set的形式传回Map将永远不会有用。

答案 1 :(得分:0)

我不确定我是否完全理解您的问题:但是如果它有帮助,请记住,杰克逊期望的类型不需要与序列化和反序列化相同。但相关名称必须与特定用例匹配。 查看您希望使用的JSON会很有帮助。

所以:在序列化事物时,杰克逊看起来是什么:

  • Getters:如果存在特定名称(来自Bean命名约定,如getName() - &gt; name;或来自@JsonProperty),它将用于获取值,使用返回类型
  • 字段:如果不存在getter,并且字段是公共的或匹配可见的setter(public,或使用@JsonProperty注释),则将使用它。类型将是字段类型。

用于反序列化,它将改为:

  • Setters:类似于寻找财产名称的吸气剂; type将是第一个参数的类型。
  • 字段:如果不存在setter,则使用字段,如果可见(与上面相同的规则,除了可以被getter“拉入”。

由于字段只有一种类型,你需要使用getter和setter(或getter + field或setter + field)的组合,以便Jackson使用的类型不同。

此外,如果您真的只需要一个属性,并且只需要转换其他内容,则可能需要使用@JsonIgnore来隐藏特定属性或访问者。 您甚至可以使用“拆分”注释,例如,getter具有@JsonProperty(因此将被使用),但是setter和field具有@JsonIgnore