Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用fasterxml.jackson重载setter反序列化到对象_Java_Jackson - Fatal编程技术网

Java 使用fasterxml.jackson重载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

我想将json字符串反序列化为对象,该对象重载了字段的setter。我不想用@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());

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){
        }
    }
}
}