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

Jackson在序列化时不包括字段的类型信息

宗政浩慨
2023-03-14
public class Test {

@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {

}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteA implements A {

}

@JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteB.class)})
interface B {

}
@JsonTypeInfo( use=JsonTypeInfo.Id.CLASS)
class ConcreteB implements B {
    A a;
    public A getA() {
        return a=new ConcreteA();
    }
}

@org.junit.Test
public void testSerialisation() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    System.out.println(objectMapper.writeValueAsString(new ConcreteB()));
}
}
{"@class":"Test$ConcreteB","a":{}}

请注意,它不包括字段'a'的类型信息。在序列化一个。时,确实包含了类型信息。

{"@class":"Test$ConcreteA"} 

更新:以下是jackson dev对此问题的解释和解决方案https://github.com/fasterxml/jackson-databind/issues/1015

共有1个答案

萧卜霸
2023-03-14

看起来你已经很接近了,你需要添加的只是告诉jackson如何处理你的接口类型的方法。

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "@class")
@JsonSubTypes({
        @JsonSubTypes.Type(value = ConcreteA.class)})
interface A {
}

因此,将@jsontypeinfo添加到接口中,将在可以配置为预期属性的属性中添加类型信息,在本例中,我选择了@class

我从示例中得到的Json输出:

{“@class”:“com.company.jackson.test$concreteb”,“a”:{“@type”:“test$concretea”}}

希望能有所帮助,

 类似资料:
  • 我得到了以下几门课: 现在,当我序列化包装在中的时,JSON不包含包含类型ID的属性。虫子?当我序列化到或只序列化到时,它可以正常工作。 编辑:我用一个简单的Spring REST控制器和两个测试制作了一个SSCCE。第一个测试是直接使用,虽然缺少,但它在反序列化中是成功的。第二个测试调用REST控制器并失败,出现错误,因为缺少: 提取类型[class com.example.demo.mySub

  • 我有一个简单的枚举,我想序列化和反序列化。该类如下所示: 问题是,我通过restful调用发送它,接收方可以接收任何类型(因此它只知道它将接收对象)。所以Jackson应该能够找出反序列化它的参数类型。 有可能这样做吗?我认为在生成的json中包含类名应该可以让Jackson判断出类型,但我一直无法做到这一点。

  • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

  • 映射器: 要序列化的类: 我不懂这个领域: 从Jackson那里找到的?我用日志检查了我的本地地图,结果发现这个字段不存在,但在序列化过程中它出现了。

  • 问题内容: 我正在尝试做一些在gson中非常容易的事情。由于我改用Jackson作为序列化程序,所以我不知道如何实现此目的: 我只想序列化已由注释标记的字段。GSON代码为: 这应该导致(JSON) (语法错误可能会被忽略-来源仅用于演示) 那么,杰克逊(Gson’s)和杰克逊(Json)的对应对象是什么? 问题答案: 似乎有一种方法可以配置为忽略所有非注释字段。 资源

  • 我希望获得以下输出:(我所要做的就是删除字段名,但保留其子字段名。) 以下是我的POJO,由使用: 下面是MAP在搜索过程中使用的我的: null 是否有一种方法可以使它与和一起使用,因为我不能同时使用这两种方法。 有人能帮忙解决这个问题吗?请指导我适当的文档或变通方法,非常感谢。

  • 我目前正在努力反序列化JSON数据结构,如下所示: 示例1: 示例 2: 我必须处理许多此类结构的实例。它是规则生成器的输出。我无法更改JSON的格式,我必须使用我得到的东西。该结构是递归的,可以有多个级别。 我正在使用Jackson的ObjectMapper并构建一些内部类来映射数据。 大多数实例看起来像示例1,对于那些已经很好地工作的实例,但是有一些更复杂的实例,比如示例2,实际上比示例2更复

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