我想将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"])
答案 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){
}
}
}
}
**如果您不想在这里处理,则可以使用自定义反序列化类。