使用 fastxml.jackson 重载 setter 反序列化为对象

Owl*_*wlR 4 java jackson

我想将 json 字符串反序列化为具有重载字段设置器的对象。我不想用 @JsonIgnore 显式注释其中一个 setter。为什么 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());
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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"])
Run Code Online (Sandbox Code Playgroud)

saj*_*jib 6

杰克逊不接受multiple settersetter您需要通过指定一个@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){
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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