Java 使用fasterxml.jackson重载setter反序列化到对象
我想将json字符串反序列化为对象,该对象重载了字段的setter。我不想用@JsonIgnore显式地注释其中一个setter。 为什么jackson库不能根据它在json字符串中获取的值的类型使用适当的setter? 代码如下:Java 使用fasterxml.jackson重载setter反序列化到对象,java,jackson,Java,Jackson,我想将json字符串反序列化为对象,该对象重载了字段的setter。我不想用@JsonIgnore显式地注释其中一个setter。 为什么jackson库不能根据它在json字符串中获取的值的类型使用适当的setter? 代码如下: public class A { Set<Integer> set = new HashSet<Integer>(); public Set<Integer> getSet() { return set; } pub
public class A {
Set<Integer> set = new HashSet<Integer>();
public Set<Integer> getSet() {
return set;
}
public void setSet(Set<Integer> set) {
this.set = set;
}
public void setSet(String str)
{
this.set = null;
}
}
=========================
String input = "{\"set\":[1,4,6]}";
A b = mapper.readValue(input, A.class);
System.out.println(b.getSet());
Jackson不接受多个设置器
。您需要通过@JsonSetter
指定一个setter
。如果要接受多个类型,则可以使用JsonNode
处理此问题。下面是一个例子:
public class A implements Serializable{
private static final long serialVersionUID = 1L;
Set<Integer> set = new HashSet<Integer>();
public Set<Integer> getSet() {
return set;
}
public void setSet(Set<Integer> set) {
this.set = set;
}
public void setSet(String str)
{
this.set = null;
}
@JsonSetter
public void setSet(JsonNode jsonNode){
//handle here as per your requirement
if(jsonNode.getNodeType().equals(JsonNodeType.STRING)){
this.set = null;
}else if(jsonNode.getNodeType().equals(JsonNodeType.ARRAY)){
try{
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Set<Integer>>() {});
this.set = reader.readValue(jsonNode);
}catch (Exception ex){
}
}
}
}
公共类A实现可序列化{
私有静态最终长serialVersionUID=1L;
Set=newhashset();
公共集getSet(){
返回集;
}
公共无效集合(集合){
this.set=set;
}
公共无效设置集(字符串str)
{
this.set=null;
}
@杰森塞特
公共void集合(JsonNode JsonNode){
//按您的要求在这里办理
if(jsonNode.getNodeType().equals(JsonNodeType.STRING)){
this.set=null;
}else if(jsonNode.getNodeType().equals(JsonNodeType.ARRAY)){
试一试{
ObjectReader=newObjectMapper().reader(newTypeReference(){});
this.set=reader.readValue(jsonNode);
}捕获(例外情况除外){
}
}
}
}
**如果你不想在这里处理,那么你可以使用自定义的反序列化类。为什么public void setSet(String str){}
会将设置为null
?只需调用方法clear
或其他什么这只是我所面临问题的一个精心设计的小例子。我不认为我需要详细说明真正的问题。问题是:根据jackson库遇到的数据类型,为什么jackson库在反序列化时不能使用适当的setter。这对我来说仍然没有意义,为什么不能更改第二个setSet
方法的名称?这将使混乱更小,更具可读性。即使这是一个简化的例子,为什么会有一个重载的setter接受集合
和字符串
?现实世界的情况是什么?
public class A implements Serializable{
private static final long serialVersionUID = 1L;
Set<Integer> set = new HashSet<Integer>();
public Set<Integer> getSet() {
return set;
}
public void setSet(Set<Integer> set) {
this.set = set;
}
public void setSet(String str)
{
this.set = null;
}
@JsonSetter
public void setSet(JsonNode jsonNode){
//handle here as per your requirement
if(jsonNode.getNodeType().equals(JsonNodeType.STRING)){
this.set = null;
}else if(jsonNode.getNodeType().equals(JsonNodeType.ARRAY)){
try{
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Set<Integer>>() {});
this.set = reader.readValue(jsonNode);
}catch (Exception ex){
}
}
}
}