我熟悉正常的多态反序列化内容,您可以根据某个字段的字符串值反序列化对象。例如:
@JsonSubTypes(
{
@JsonSubTypes.Type(value = LionCage.class, name = "LION"),
@JsonSubTypes.Type(value = TigerCage.class, name = "TIGER"),
}
)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
如果"类型"有什么方法可以做同样的事情吗?传入对象的字段是整数而不是字符串?所以在上面的例子中," LION"和#34; TIGER"将是1和2.无论出于何种原因,我都无法解决这个问题。
另外,我应该如何解决这个问题?似乎它应该是明显的东西。
答案 0 :(得分:1)
Jackson自动将字符串转换为数字,反之亦然。只需将字符串值用作数字。就像"1"
的{{1}}值。只需自己尝试一下(杰克逊版本为1
):
2.5.1
输出为:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
public class HelloWorldJacksonNumber {
public static class A extends Base {
String a;
}
public static class B extends Base {
String b;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = A.class, name = "1"),
@JsonSubTypes.Type(value = B.class, name = "2")})
public static class Base {
int type;
}
public static void main (String[] args) throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.version());
System.out.println(objectMapper.writeValueAsString(new A()));
System.out.println(objectMapper.writeValueAsString(new B()));
System.out.println(objectMapper.readValue("{\"type\":\"1\"}", Base.class).getClass());
System.out.println(objectMapper.readValue("{\"type\":\"2\"}", Base.class).getClass());
}
}
答案 1 :(得分:0)
不,这不是通过注释的选项。 TypeIdResolver接口接受并返回字符串。你可以使用Jackson的流API使用自定义解析器/序列化器来完成它,但是将它切换到数字字段似乎需要做很多工作。如果其他人的系统需要它,我只会这样做。如果我拥有整件事,我会使用您在问题中发布的设置。