类:
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或其他任何东西。但如果有一个选项,我宁愿不这样做。
感谢您的帮助
答案 0 :(得分:0)
没有直接的方法可以将Set
转换为Map
。 Set
是Collection
的扩展,Map
是完全不同的对象。如果ContactInfoInterface
包含手动构建 a Map
所需的信息,则可以执行此操作。但是尝试以Set
的形式传回Map
将永远不会有用。
答案 1 :(得分:0)
我不确定我是否完全理解您的问题:但是如果它有帮助,请记住,杰克逊期望的类型不需要与序列化和反序列化相同。但相关名称必须与特定用例匹配。 查看您希望使用的JSON会很有帮助。
所以:在序列化事物时,杰克逊看起来是什么:
getName()
- &gt; name
;或来自@JsonProperty
),它将用于获取值,使用返回类型@JsonProperty
注释),则将使用它。类型将是字段类型。用于反序列化,它将改为:
由于字段只有一种类型,你需要使用getter和setter(或getter + field或setter + field)的组合,以便Jackson使用的类型不同。
此外,如果您真的只需要一个属性,并且只需要转换其他内容,则可能需要使用@JsonIgnore
来隐藏特定属性或访问者。
您甚至可以使用“拆分”注释,例如,getter具有@JsonProperty
(因此将被使用),但是setter和field具有@JsonIgnore
。