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

Jackson java.util.Optional序列化不包括类型ID

曹疏珂
2023-03-14

我得到了以下几门课:

@JsonIdentityInfo(
    generator = ObjectIdGenerators.IntSequenceGenerator.class,
    property = "oid"
)
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "clazz")
@JsonSubTypes({
    @JsonSubTypes.Type(value = MySubEntity.class, name = "MySubEntity"),
})
public abstract class Entity {
    ...
}

public class MySubEntity extends Entity {
    ...
}

现在,当我序列化包装在optional中的mysubentity时,JSON不包含包含类型ID的clazz属性。虫子?当我序列化到列表 或只序列化到mysubentity时,它可以正常工作。

@RequestMapping(method = RequestMethod.GET, value = "/{uuid}", produces = "application/json")
public Optional<MySubEntity> findByUuid(@PathVariable("uuid") String uuid) {
    ...
}

编辑:我用一个简单的Spring REST控制器和两个测试制作了一个SSCCE。第一个测试是直接使用objectmapper,虽然缺少clazz,但它在反序列化中是成功的。第二个测试调用REST控制器并失败,出现错误,因为缺少clazz:

提取类型[class com.example.demo.mySubentity]和内容类型[application/json;charset=utf-8]的响应时出错;嵌套异常为org.springframework.http.converter.httpmessagenotreadableException:JSON解析错误:尝试解析[simple type,class com.example.demo.MySubEntity]的子类型时缺少类型id:缺少类型id属性“clazz”;嵌套异常为com.fasterxml.jackson.databind.exc.InvalidTypeIdeXception:尝试解析[simple type,class com.example.demo.MySubEntity]的子类型时缺少类型id:缺少类型id属性“clazz”

共有1个答案

宗政欣可
2023-03-14

这,确实,看起来像一个虫子。对于这种情况,我可以建议一个解决办法,就是使用jsonTypeInfo.as.existing_property并将字段clazz添加到实体中。这种方法只有一种情况是必须在java代码中手动设置clazz。然而,这是很容易克服的。以下是建议的解决办法的完整代码:

@JsonIdentityInfo(
        generator = ObjectIdGenerators.IntSequenceGenerator.class,
        property = "oid"
)
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXISTING_PROPERTY, //field must be present in the POJO
        property = "clazz")
@JsonSubTypes({
        @JsonSubTypes.Type(value = MySubEntity.class, name = "MySubEntity"),
})
public abstract class Entity {

    @JsonProperty
    private String uuid;

    //Here we have to initialize this field manually.
    //Here is the simple workaround to initialize in automatically
    @JsonProperty
    private String clazz = this.getClass().getSimpleName();

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getClazz() {
        return clazz;
    }

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

  • 本文向大家介绍PHP 不同类型的序列化,包括了PHP 不同类型的序列化的使用技巧和注意事项,需要的朋友参考一下 示例 生成值的可存储表示形式。 这对于存储或传递PHP值而不丢失其类型和结构很有用。 要再次将序列化的字符串转换为PHP值,请使用unserialize()。 序列化字符串 序列化双精度 序列化浮点数 浮点数被序列化为双打。 序列化整数 序列化布尔值 序列化null 序列化数组 序列化对

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

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

  • 我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。

  • 问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列