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

如何使用地图进行多态杰克逊序列化

樊胜
2023-03-14

我尝试序列化Jackson属性类型信息,即使我的类型被映射引用。

使用此简单示例:

import java.util.HashMap;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DemoJackson {
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
    public static abstract class Animal {}

    @JsonTypeName("cat")
    public static class Cat extends Animal {}

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        Cat cat = new Cat();
        System.out.println(objectMapper.writeValueAsString(cat));

        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("data", cat);

        System.out.println(objectMapper.writeValueAsString(map));
    }
}

我得到:

{"@type":"cat"}
{"data":{}}

但我想有:

{"@type":"cat"}
{"data":{"@type":"cat"}}

可能吗?怎么做?

我已经尝试使用enableDefaultTyping,但我得到:

{"@type":"cat"}
{"data":["DemoJackson$Cat",{}]}

共有1个答案

吴俊晤
2023-03-14

当您直接序列化地图时,由于泛型类型,对象映射器需要有关地图内容的类型信息。请参阅多态类型处理wiki页面的第5.1章。

序列化Animals映射时传递类型引用信息的示例。

objectMapper.writerWithType(new TypeReference<Map<String, Animal>>() {})
    .writeValueAsString(map)

输出:

{"@type":"cat"}
{"data":{"@type":"cat"}}
 类似资料:
  • 问题内容: 我们将JSON序列化与Jackson结合使用,以公开系统的内部状态以调试属性。 默认情况下,杰克逊不会序列化瞬态字段-但我也希望对其进行序列化。如何序列化这些字段? 我知道的一种方法是为这些字段提供getter-但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有些getter会更改对象状态)。 我知道我可以创建一个注释,但是我真的想避免使用它。 所以我的问题是:有没有一种

  • 问题内容: 我有以下JSON: 当日期每次更改时,我该如何解析呢?我必须使用Jackson进行解析。 问题答案: 当您具有 动态键时 ,可以使用。键的类型和值取决于您的需要。 最简单的方法是。您需要为此: 假设您的密钥是 有效日期 ,则可以使用。 需要以下依赖项: 然后您可以拥有: 最后,您可以将动态键的值映射到Java类。让我们称之为: 然后您可以拥有:

  • 问题内容: 我正在尝试使用Jakson反序列化嵌套的多态类型。意思是我的顶级类型引用了另一个多态类型,该类型最终由不是抽象的类扩展。这不起作用,并引发异常。 这是我要尝试做的简化示例。 我得到有关抽象类型的标准例外。 让我解释一下我的用例。我有一个描述数据工作流程的Json文档。我在“一级”有一个抽象类型,描述了对单个值的操作。我派生了一堆不是抽象的类,它们实现了常见的操作(我用@JsonSubT

  • 问题内容: 我想反序列化JSON对象中的任何未知字段,作为pojo成员的映射中的条目。 例如json 和pojo 有没有办法用杰克逊配置它?如果不是,是否有一种有效的方法编写a 来做到这一点(假设in中的值可以是更复杂但众所周知的一致类型)? 问题答案: 有一个功能和一个注释正好适合此目的。 经过测试,它可以像您的示例一样使用UUID: 它将像这样工作: 同样,更常见的类型(例如字符串)也可以工作

  • 问题内容: 我有一些要映射到我的对象的JSON : 我的对象看起来像: 这是我的代码: 我不断收到此错误: 我在网上找到的所有示例都只是将JSON反序列化为带有少量或成员变量的简单POJO 。如何正确地将JSON映射到我的字段并使其行为正确? 我以为一旦工作成功就会返回,而会返回另一个(或)。我对使用Jackson还是很陌生,所以这甚至可能都不是我想要做的正确方法。任何帮助,将不胜感激! 问题答案

  • 我在一个文件中有以下 JSON 当我使用Jackson将其反序列化为Java对象时,我得到以下错误 我正在使用以下代码 object mapper mapper = new object mapper(); 我已经为初始数组使用了类型引用,但如何将类型引用用于对象EnrolledEnrolment内的hashmap。 当它尝试解析第二个数组时抛出错误?有什么想法吗? 谢谢