Java getter返回的类型与Jackson中的字段类型不同。如何将地图转换为集合?

Java getter返回的类型与Jackson中的字段类型不同。如何将地图转换为集合?,java,jackson,Java,Jackson,课程: public class Contact implements ContactInterface { private Set<ContactInfoInterface> contactInfo; public Map<String, ContactInfo> getContactInfo() { // create maps from contactInfo set return map; } //

课程:

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;
    }
}
公共类联系人实现了ContactInterface{
私人设置联系人信息;
公共地图getContactInfo(){
//从contactInfo集合创建地图
返回图;
}
//无二传手
}
公共类ContactInfo实现ContactInfoInterface{
私有字符串contactInfoValue;
公共字符串getContactInfoValue{
返回此.contactInfoValue;
}
public void setContactInfoValue(字符串值){
this.contactInfoValue=值;
}
}
杰克逊·米辛:

public abstract class ContactMixIn implements ContactInterface {

    @JsonProperty
    public abstract Map<String, ContactInfo> getContactInfo();
}
公共抽象类ContactMixIn实现ContactInterface{
@JsonProperty
公共抽象映射getContactInfo();
}
我对反序列化Jackson创建的json有问题。在序列化的结果中,我得到了json,其中有一个contactInfo作为映射(这基本上就是我们在getter中作为返回类型得到的)。但是当我反序列化它时,Jackson试图将contactInfo实例化为一个集合(这也是正确的,因为contactInfo是一个集合)。但是Jackson当然不能将json值映射到set,并且会发生奇怪的异常。所以我的问题是,在这种情况下,如何反序列化映射以获得ContactInfoInterface集

它们不是第三方类,所以我可以向它们添加setter或其他任何内容。但如果有选择的话,我宁愿不这样做


感谢您的帮助

无法直接将
集合
转换为
地图
Set
Collection
的扩展,
Map
是一个完全不同的对象。如果
ContactInfoInterface
包含手动构建
Map
所需的信息,您可以这样做。但是试图以
映射的形式传回
集合
是行不通的。

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

因此:在序列化内容时,Jackson看起来是:

  • Getters:如果存在一个特定名称的Getters(来自Bean命名约定,如
    getName()
    ->
    name
    ;或者来自
    @JsonProperty
    ),则将使用返回类型获取值
  • 字段:如果不存在getter,并且字段是公共的或与可见的setter(公共的或用
    @JsonProperty
    注释的)匹配,则将使用它。类型将是字段的类型
对于反序列化,它将改为:

  • setter:在查找属性名称方面类似于getter;类型将是第一个参数的类型
  • 字段:若不存在setter,则使用字段,若可见(与上述规则相同,但getter可以“拉入”字段)
由于字段只有一种类型,所以您需要使用getter和setter的组合(或getter+field,或setter+field),以便Jackson使用不同的类型

此外,如果您确实只需要一个属性,而其他东西仅用于转换,则可能需要使用
@JsonIgnore
隐藏特定属性或访问器。
您甚至可以使用“拆分”注释,比如说,getter具有
@JsonProperty
(因此将使用它),但setter和field有
@JsonIgnore

我不这么认为,你明白我的意思。当然,我从集合手动创建映射,getter方法返回该映射,然后将其转换为json。在反序列化过程中,Jackson试图将json中的内容放入集合。我想知道如何序列化和反序列化Contact instance需要正确实例化一组ContactInfo。如果我没记错的话,序列化知道私有字段的类型。这意味着您需要一个与字段的实际类型相对应的getter和setter。我想知道最简单的方法是否是为ContactInfo集添加新的基本getter:public set getContactInfo(){}但不要将其添加到ContactInterface,然后将ContactMixIn更改为扩展Contact类,而不是实现ContactInterface。您认为呢?