使用 Jackson 序列化类型化集合时出错

2024-04-20

我正在尝试使用混合序列化集合,但杰克逊不会保存类型信息。这是一个基本测试,说明会发生什么:

public class CollectionSerializationTest {

    interface Common extends Serializable {

    }

    class A implements Common {
        private static final long serialVersionUID = 1L;
    }

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({ @JsonSubTypes.Type(value = A.class, name = "CODE") })
    class AMixIn {

    }

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({ @JsonSubTypes.Type(value = B.class, name = "CODE") })
    class BMixIn {

    }

    class B implements Common {
        private static final long serialVersionUID = 1L;
    }

    @Test
    public void test() throws JsonGenerationException, JsonMappingException,
            IOException {
        ObjectMapper om = new ObjectMapper();
        List<Common> list = new ArrayList<Common>();
        A a = new A();
        B b = new B();
        list.add(a);
        list.add(b);
        om.getSerializationConfig().addMixInAnnotations(A.class, AMixIn.class);
        om.getSerializationConfig().addMixInAnnotations(B.class, BMixIn.class);
        System.out.println(om.writeValueAsString(list)); // Outputs [{},{}]
        System.out.println(om.writeValueAsString(a));// Outputs {"type":"CODE"}
    }

}

我如何实现输出[{"type":"CODE"},{"type":"CODE"}]在第一个输出上?


我不确定这是否是最简单的解决方案,但我认为你可以这样做:

  1. 创建新的列表实现
  2. 为新类型编写序列化器
  3. 在 POJO 类中使用此类型

扩展的新 Java 类ArrayList:

@JsonSerialize(using = JacksonListSerializer.class)
class JacksonList<E> extends ArrayList<E> {

    private static final long serialVersionUID = 1L;
}

上述类的序列化器:

class JacksonListSerializer extends JsonSerializer<JacksonList<?>> {

    @Override
    public void serialize(JacksonList<?> list, JsonGenerator generator, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        generator.writeStartArray();
        if (list != null) {
            for (Object item : list) {
                generator.writeObject(item);
            }
        }
        generator.writeEndArray();
    }
}

现在,您可以在示例中使用此列表:

public static void main(String[] args) throws IOException {
    ObjectMapper om = new ObjectMapper();
    List<Common> list = new JacksonList<Common>();
    list.add(new A());
    list.add(new B());
    om.addMixInAnnotations(A.class, AMixIn.class);
    om.addMixInAnnotations(B.class, BMixIn.class);
    System.out.println(om.writeValueAsString(list));
    System.out.println(om.writeValueAsString(new A()));
}

上面的例子打印:

[{"type":"CODE"},{"type":"CODE"}]
{"type":"CODE"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jackson 序列化类型化集合时出错 的相关文章

  • Spring - 是否可以获取所有使用@ComponentScan注册的包?

    是否可以获取使用 ComponentScan 注册的所有包的列表 我需要知道 我的 Spring Boot 应用程序中已经注册了哪些 root 包 可能的解决方案 在运行时扫描Java注释 https stackoverflow com q
  • 尝试将 XLSX 数据导入 R 时出现 IllegalArgumentException

    在将 xlsx 文件导入 R 时 我遇到了以下错误 mydata lt read xlsx C Users aniruddha Downloads failingExample xlsx 1 Error in jcall row ir Lo
  • 为什么我们在Java中使用接口引用类型? [复制]

    这个问题在这里已经有答案了 我即将参加第一门面向对象编程课程的期末考试 但我仍然不明白多态性的概念 假设我有一个抽象类 Vehicle 该类有一个名为 Aircraft 的子类 我的问题是 这两个代码有什么不同 Aircraft Jetpl
  • 我需要帮助理解 java 中 Timer 类的 ScheduleAtFixedRate 方法

    作为一个粉丝番茄工作法 http www pomodorotechnique com 我正在为自己制作一个倒计时器 以保证我完成作业 然而 这个特定的项目不是家庭作业 Stack 有很多关于使用计时器来控制用户输入之前的延迟等问题 但关于独
  • Java并发中的AbstractQueuedSynchronizer

    What is AbstractQueuedSynchronizer在Java中concurrent locks包用来做什么 有人可以阐明它的方法吗doAcquireInterruptibly and parkAndCheckInterru
  • “赠送”应用内购买 Android

    有没有办法将 Google Billing 中的应用内购买 赠送 给特定帐户 我把这个问题放在这里是因为如果有一种方法可以以编程方式完成它 那很好 但不是必须的 在官方文档中找不到任何相关内容 我想要这个的原因是因为我的一个应用程序目前处于
  • 数据表到 JSON [重复]

    这个问题在这里已经有答案了 我最近需要将数据表序列化为 JSON 我现在仍然使用 Net 2 0 因此我无法在 Net 3 5 中使用 JSON 序列化器 我想这肯定是以前做过的 所以我上网查了一下found http www codepr
  • 如何将 JTextField 添加到 JFrame 的菜单栏?

    我一直在尝试重载 JMenu 并放入一些自定义代码来支持 JTextField 但进展并不顺利 我在这里的主要目的是在菜单项的右侧添加一个搜索字段 因此 我在左侧有 文件 编辑 帮助 之类的东西 然后在右侧是搜索栏 几乎就像某些浏览器中的谷
  • Xstream:删除类属性

    我该如何删除类 某事 Xstream 中的属性 我使用带注释的 Xstream 我读了它的代码 发现你的类不是mapper defaultImplementationOf fieldType 它会为你添加默认的类属性 除非类属性名称为nul
  • 根据条件更改 JSlider 的最小值和最大值

    我正在 Netbeans 中创建 Swing GUI 此 GUI 的目的是打开一个 缓冲 图像 在 JLabel 中作为图标 并对其应用仿射变换 现在我正在做 4 个转换 如下所示 现在 每个变换都需要两个滑块来更改 X 和 Y 值 但旋转
  • Spring方法获取给定类型的所有bean

    我试图从一个相同类型的豆子中获取所有豆子FileSystemXmlApplicationContext 我正在使用factory getBeansOfType SomeType class 但我注意到它只返回顶级 bean 是否有任何其他方
  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • 修改void函数的输入参数并随后读取它

    我有一个相当复杂的 java 函数 我想使用 jUnit 进行测试 并且我正在使用 Mockito 来实现此目的 这个函数看起来像这样 public void myFunction Object parameter doStuff conv
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • 对 JFace Treeviewer 多列进行排序

    我希望用户能够对TreeViewer只要他想 只要单击列标题即可 但是我不知道正确的方法 我发现我们可以使用ViewerComparator对不同的元素进行排序 但是 我不知道如何设置侦听器以便能够正确进行升序或降序排序 有没有办法让 JF
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • NumPy 数组不可 JSON 序列化

    创建 NumPy 数组并将其保存为 Django 上下文变量后 加载网页时收到以下错误 array 0 239 479 717 952 1192 1432 1667 dtype int64 is not JSON serializable
  • 无法在 JDBCPreparedStatement 中使用 LIKE 查询吗?

    查询代码及查询方式 ps conn prepareStatement select instance id from eam measurement where resource id in select RESOURCE ID from
  • 使用 Jackson 作为 Jersey 客户端序列化器

    使用 Jersey Client API 时 是否可以使用 Jackson 作为 JSON 数据的序列化器 编组器而不是 JAXB 如果可以的话该如何配置呢 好吧 我发现了 原来很简单 ClientConfig cc new Default
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore

随机推荐