是否可以为Jackson / POJO映射器创建重载的setter?

时间:2014-04-12 10:42:13

标签: 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));
}

杰克逊可以序列化/反序列化吗? 理想情况下,我希望(至少)支持反序列化。

我在网上搜索过,发现没有明确答案。一些错误报告,以及@ignore'不必要的'getter / setter的建议,但我想要所有这些。

感谢。

1 个答案:

答案 0 :(得分:1)

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

我仍然鼓励你重新考虑设计但是:

豆:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class SampleBean {

    @JsonDeserialize(using = SampleDeserializer.class)
    public String data;
}

解串器:

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