首页 > 解决方案 > Java Jackson 从多个模块中选择注册模块以将 JSON 序列化为字符串?

问题描述

我有一个简单的 java 类,想将它序列化为不同的 JSON 输出。例如:

Class User {
    public int id; 
    public String name;
} 

// 2 expected outputs
Version 1 (V1): {"id": "1", "first_name": "A"} 
Version 2 (V2): {"id": "1", "name": "A"}

我创建了 2 个自定义模块来写入 JSON 字符串,并将它们注册到一个 ObjectMapper,如下所示:

public class ItemSerializerModuleV1 extends SimpleModule {

    public ItemSerializerModuleV1() {
        super(NAME, VERSION_UTIL.version());
        addSerializer(Item.class, new ItemSerializerV1());
    }
}

public class ItemSerializerModuleV2 extends SimpleModule {

    public ItemSerializerModuleV2() {
        super(NAME, VERSION_UTIL.version());
        addSerializer(Item.class, new ItemSerializerV2());
    }
}

ObjectMapper mapper = new ObjectMapper();
mapper.registerModules(new ItemSerializerModuleV1(), new ItemSerializerModuleV2());

但是,当 ObjectMapper 写入 JSON string 时,我不知道如何选择应该使用哪个模块。它只使用下面的代码选择 V2 模块(最后一个注册的模块),而我也想写为 V1。

String serialized = mapper.writeValueAsString(myItem);

标签: javajsonserializationjackson

解决方案


模块可用于扩展 提供的功能ObjectMapper,例如,通过添加自定义序列化器和反序列化器的提供程序。注册后,您无法为特定序列化选择模块或禁用模块。

所以你应该有两个实例,ObjectMapper每个实例都会注册一个不同的模块。


推荐阅读