当前位置: 首页 > 知识库问答 >
问题:

整数字段而不是字符串上的Jackson多态反序列化

费承载
2023-03-14

我熟悉常规的多态反序列化方法,即根据某个字段的字符串值反序列化对象。例如:

@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")

还有,我该怎么弄明白呢?看来应该是很明显的事情。

共有1个答案

太叔鸿
2023-03-14

Jackson自动将字符串转换为数字,反之亦然。只需对数字使用字符串值即可。如1值的“1”。你自己试试(jackson版本是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());
    }
}

输出为:

2.5.1
{"type":"1"}
{"type":"2"}
class HelloWorldJacksonNumber$A
class HelloWorldJacksonNumber$B
 类似资料:
  • Jackson版本:2.10.1 谢谢你的回答!

  • 问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么

  • 我有以下由Jackson映射的类(简化版): 在某些情况下,服务器返回,然后我想将name设置为空Java字符串。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串吗?

  • 我正在尝试为接受JSON输入的前端库创建一个java SDK。本质上,此SDK将特定类型的对象转换为JSON,然后由前端库使用。 我正在使用杰克逊的多态序列化/反序列化使用它的注释系统。 我有一个基类a和扩展a的两个子类B和C。类a有一个类型字段,我用它来决定要使用哪个类(B或C)。语法如下所示: 现在,当我使用Jackson的ObjectMapper函数读取字符串化的JSON并转换为类A时,我根

  • 我有这样一门课: 我知道基于typeToClassId的对象obj是什么类型,不幸的是只有在运行时才知道。 我想基于typeToClassId解析出obj——这里最好的方法是什么?注释似乎已经过时了,基于ObjectMapper的东西似乎是对的,但我很难弄清楚最好的方法可能是什么。 类似于类clazz=lookUpClassBasedOnId(typeToClassId)objectMapper的

  • 我是一个绝对的初学者,没有任何编程语言的经验。 我写了一个程序作为将阿拉伯数字转换成罗马数字的练习。它起作用了。然而,如果输入的是字符串而不是整数,我想添加一部分来处理这个问题。我不知道该怎么做。我试图使用try/catch,但我不知道如何正确使用它。现在程序要求我输入两次数字。怎么办? 以下是他的主要方法: