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

如何使用Java和Jackson库反序列化Json字符串以获得多态结果?

太叔京
2023-03-14

我有一个类容器,它包含一个列表。基类不是抽象类,但基类有两个子类型:BaseClassA和BaseClassB,每个子类型都有额外的字段。

BaseClass有一个Attribute枚举类型,我可以从中确定对象是BaseClass、BaseClassA还是BaseClassB,以及我想用作鉴别器的对象。

我怎么能告诉Jackson鉴别器,这样当它反序列化json字符串时,它就会构建正确的对象。目前每个对象都被实例化为BaseClass,因此我无法在我的java代码中对其进行强制转换。与@判别公式相同

我发现了这个问题:如何使用Java和Jackson Library对Json String进行多态反序列化?这有点接近,但在这里用户只想要基本类型。

共有1个答案

万俟财
2023-03-14

我猜您可能已经解决了这个问题,但如果没有,请查看JsonTypeInfo作为一种使用子类型注释类以进行去序列化的方法。此链接http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html有一个仍然有效的很好的解释。如果不能对类进行注释,可以使用配置来设置混入(请参见https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations)允许您向现有类添加注释。

 类似资料:
  • 问题内容: 我有一些类A,B,C,它们都继承自BaseClass类。 我有一个String json,其中包含A,B,C或BaseClass的json表示形式。 我想要某种方法将此字符串反序列化为BaseClass(多态反序列化)。像这样 可以是A,B,C或BaseClass中任何一个的Json String表示形式。 问题答案: 目前尚不清楚原始海报有什么问题。我猜这是两件事之一: 未绑定JSO

  • 问题内容: 类型1(docs链接): 类型2(docs链接): 尽管以上两种类型都能完成任务,但这些实现之间有什么区别? 问题答案: 构造之后,两者都调用相同的反序列化功能,因此唯一的区别是泛型类型的处理方式。 第二个是完全静态的,因此类型必须在编译类型中是已知的,并且不能改变。因此,它类似于使用基本Class文字。 第一个是动态的,因此可以用于构造因其参数设置而变化的事物。 就我个人而言,我更喜

  • 我正在尝试使用Jackson将反序列化为,但它不起作用。 我有一个带有LocalDateTime字段的数据类: 我添加了特殊的Jackson数据类型模块: 序列化可以在以下情况下正常工作: 结果字符串: 但反序列化不适用于: 作为错误,我得到: 我错过了什么?我对串行化有效而反序列化无效感到困惑。 MWE:(小格拉德尔Java项目) Main.java: build.gradle:

  • 我的问题类似于防止GSON序列化JSON字符串,但是那里的解决方案使用GSON库,而我仅限于使用Jackson(fasterxml)。 我有一个实体类,如下所示: 我想用映射的json字符串表示填充body字段,然后将其作为ResponseEntity的一部分发送。如下事物: 预期输出: 实际输出: 我在用 Jackson Core v2.8.2 标记,但这没有帮助,因为我的字段在写入实体时已经从

  • 问题内容: 我有数据类/表“ User”,其中有“ preferences”列 首选项类型为TEXT,我在其中存储JSON。 所以价值是 如何使用一些注释将其包装起来,以便像 或无需包装到数据对象中 我想可能会有一些Jackson注释可以添加到字段中,例如 我对JPA相当陌生,文档非常丰富。 我相信我的情况很普遍。谁能举任何例子? 问题答案: 老实说,我认为最好的解决方案是为属性创建一个单独的表(

  • 我已经找了很多但仍然没有得到答案到目前为止,任何帮助是非常感谢! 我有一个简单的到字段映射,并尝试将JSON字符串读取到Java对象。 例外情况: java.lang.IllegalArgumentException:无法解析日期值“null”(格式:“dd-mmm-yyyy”):不可解析日期:“null”com.fasterxml.jackson.databind.deser.std.dateD