我想将 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)
杰克逊不接受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){
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
**如果您不想在这里处理,那么您可以使用自定义反序列化类。