Serialization 是否可以为Jackson/POJO映射器创建重载设置器?

Serialization 是否可以为Jackson/POJO映射器创建重载设置器?,serialization,jersey,operator-overloading,deserialization,Serialization,Jersey,Operator Overloading,Deserialization,我有一门课: @Column(name = "data", nullable = false) String data; public void setData(final String data) { this.data = data; } public void setDataAsSet(final Set<String> strings) { setData(JOINER.join(strings)); } @Column(name=“dat

我有一门课:

    @Column(name = "data", nullable = false)
String  data;


public void setData(final String data) {
    this.data = data;
}


public void setDataAsSet(final Set<String> strings) {
    setData(JOINER.join(strings));
}
@Column(name=“data”,nullable=false)
字符串数据;
公共void setData(最终字符串数据){
这个数据=数据;
}
公共无效setDataAsSet(最终设置字符串){
setData(JOINER.join(strings));
}
Jackson可以序列化/反序列化它吗? 理想情况下,我希望(至少)支持反序列化

我在网上搜索,没有找到明确的答案。一些bug报告和建议@忽略“不必要的”getter/setter,但我想要所有这些


谢谢。

编写自定义反序列化程序似乎是可能的。不幸的是,现在没有机会设置env并尝试。但总的来说,我不认为发送与
String
Set
相同的数据是个好主意。这将导致难以调试的bug或其他不可预知的问题。应该有两个单独声明的字段,或者它应该始终是一个集合(在大多数情况下,它可能只有一个元素)。请重新考虑一下

我仍然鼓励您重新思考设计,尽管如此:

豆子:

反序列化程序:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.util.List;

import static com.fasterxml.jackson.core.JsonToken.VALUE_STRING;

public class SampleDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException {
        JsonToken jt = jp.getCurrentToken();
        if (jt == VALUE_STRING) {
            return jp.getValueAsString();
        } else if (jt == JsonToken.START_ARRAY) {
            return jp.readValueAs(List.class).toString().replace("[", "").replace("]", "").replaceAll("\\s*", "");// joining could be done much better of course
        }

        return null;
    }
}

我不明白。这段代码甚至没有编译。。。不是因为“…”@opal,这是伪代码。我有重载的setter(一个带有String对象,一个带有Set)和getter(一个返回字符串,另一个返回字符串集)。杰克逊支持它吗?如果支持的话,又是如何支持的?谢谢,嗯。好啊但这并不是重载——您有相同的方法名,只有不同的返回类型。它不会编译。请编辑并粘贴您想要映射的完整示例bean。@opal您是对的。我太累了。忽略“setters”。@opal粘贴的真实代码。我希望客户端能够发送逗号分隔的字符串,如:“a,b,b”或一组字符串。
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.util.List;

import static com.fasterxml.jackson.core.JsonToken.VALUE_STRING;

public class SampleDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException {
        JsonToken jt = jp.getCurrentToken();
        if (jt == VALUE_STRING) {
            return jp.getValueAsString();
        } else if (jt == JsonToken.START_ARRAY) {
            return jp.readValueAs(List.class).toString().replace("[", "").replace("]", "").replaceAll("\\s*", "");// joining could be done much better of course
        }

        return null;
    }
}
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;

public class SampleTest {

    @Test
    public void test() throws IOException {
        final String json = "{\"data\":\"2\"}";
        final String json2 = "{\"data\":[\"2\",\"3\"]}";

        ObjectMapper om = new ObjectMapper();
        SampleBean sb = om.readValue(json, SampleBean.class);
        Assert.assertEquals("2", sb.data);
        sb = om.readValue(json2, SampleBean.class);
        Assert.assertEquals("2,3", sb.data);
    }
}