1

课程:

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();
}

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

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

感谢帮助

4

2 回答 2

0

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

所以:在序列化事物时,杰克逊的样子是:

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

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

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

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

另外,如果你真的只想要一个属性,而其他的东西只需要转换,你可能需要使用@JsonIgnore隐藏特定的属性或访问器。您甚至可以使用“拆分”注释,例如,getter 具有@JsonProperty(因此将被使用),但 setter 和字段具有@JsonIgnore.

于 2013-08-05T23:30:05.460 回答
0

没有直接的方法将 a 转换Set为 a MapSet是 的延伸CollectionMap是完全不同的对象。如果ContactInfoInterface包含您需要手动构建的信息,Map您可以这样做。但是试图以 aSet的形式传回 a 是Map行不通的。

于 2013-08-02T14:33:26.787 回答