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