我有一个班级:
@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的建议,但我想要所有这些。
感谢。
答案 0 :(得分:1)
似乎可以编写自定义反序列化器。不幸的是现在没有机会设置env并尝试。但总的来说,发送String
或Set<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);
}
}