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