使用fastxml.jackson将具有重载setter的对象反序列化

时间:2018-07-26 12:34:59

标签: java jackson

我想将json字符串反序列化为对象,该对象的字段的setter重载了。我不想用@JsonIgnore显式注释设置器之一。 为什么Jackson图书馆无法根据在JSON字符串中获取的值的类型使用适当的setter? 以下是代码:

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

我遇到以下错误:

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
 at [Source: (String)"{"set":[1,4,6]}"; line: 1, column: 8] (through reference chain: com.rs.multiplesetter.A["set"])

1 个答案:

答案 0 :(得分:1)

杰克逊不接受multiple setter。您需要通过setter指定一个@JsonSetter。如果要接受多种类型,则可以使用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){
        }
    }
}
}

**如果您不想在这里处理,则可以使用自定义反序列化类。