有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

getter返回的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;
    }
}

杰克逊·米辛:

public abstract class ContactMixIn implements ContactInterface {

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

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

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

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

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

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

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

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

    • setter:在查找属性名称方面类似于getter;类型将是第一个参数的类型
    • 字段:若不存在setter,则使用字段,若可见(与上述规则相同,但getter可以“拉入”字段)

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

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

  2. # 2 楼答案

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