gpt4 book ai didi

java - Jackson ObjectMapper 使用自定义序列化器和反序列化器

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:04 72 4
gpt4 key购买 nike

我有一个配置 Jackson ObjectMapper 的类。它为我的对象类型添加了一些自定义序列化器和反序列化器,如下所示:

public class JsonMapperFactory {
public static ObjectMapper createObjectMapper() {
final SimpleModule module = new SimpleModule("customerSerializationModule", new Version(1, 0, 0, "static version"));
addCustomDeserializersTo(module);
addCustomSerializersTo(module);

final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
private static void addCustomSerializersTo(final SimpleModule module) {
module.addSerializer(DateTime.class, new DateTimeSerializer());
}
private static void addCustomDeserializersTo(final SimpleModule objectMapper) {
objectMapper.addDeserializer(DateTime.class, new DateTimeDeserializer());
}
}

我已经在他们自己的测试类中测试了我的客户序列化器,所以在我对这个 JsonMapperFactory 类的测试中,我试图简单地检查创建的 ObjectMapper 是否具有预期的序列化器(或反序列化器) ) 这可以通过内省(introspection) ObjectMapper 来实现,但它似乎没有任何机制可以做到这一点。

有人知道测试它的好方法吗?

对于反序列化器,我有以下内容:

private void assertThatObjectMapperUsesCorrectDeserializer(final Class<?> typeClazz, final Class<?> deserializerClazz) throws JsonMappingException {
final DeserializationConfig deserializationConfig = this.objectMapper.getDeserializationConfig();
final JsonDeserializer<Object> deserializer = this.objectMapper.getDeserializerProvider().findTypedValueDeserializer(deserializationConfig, javaTypeFor(typeClazz), null);
assertThat(deserializer, is(instanceOf(deserializerClazz)));
}
private JavaType javaTypeFor(final Class<?> clazz) {
return TypeFactory.type(clazz); //deprecated method :(
}

它非常冗长并且使用了已弃用的方法。

我还没有找到对序列化程序进行类似测试的方法。所以我目前使用序列化一个对象并检查它是否正确序列化(本质上是重复序列化程序测试)

非常欢迎任何想法。

最佳答案

根据此处提供的答案和评论,我最近重新设计了该类,以便为 ModuleObjectMapper 使用构建器。这允许我提供模拟并检查是否将正确的(反)序列化器添加到模块,然后模块按预期注册到对象映射器。

对象映射器生成器:

public class ObjectMapperBuilder {
ObjectMapper mapper;

public ObjectMapperBuilder configure(final ObjectMapper mapper) {
this.mapper = mapper;
return this;
}

public ObjectMapperBuilder withModule(final Module module) {
this.mapper.registerModule(module);
return this;
}

public ObjectMapper build() {
return this.mapper;
}
}

模块生成器:

public class SimpleModuleBuilder {
SimpleModule module;

public SimpleModuleBuilder configure(final SimpleModule module) {
this.module = module;
return this;
}

public <X> SimpleModuleBuilder withSerializer(final Class<X> clazz, final JsonSerializer<X> serializer) {
this.module.addSerializer(clazz, serializer);
return this;
}

public <X> SimpleModuleBuilder withDeserializer(final Class<X> clazz, final JsonDeserializer<X> deserializer) {
this.module.addDeserializer(clazz, deserializer);
return this;
}

public SimpleModule build() {
return this.module;
}
}

最后,新的 JsonMapperFactory:

public class JsonMapperFactory {

public static ObjectMapper configureObjectMapper(final ObjectMapper mapper, final SimpleModule module) {
final SimpleModuleBuilder modulebuilder = new SimpleModuleBuilder();

final SimpleModule configuredModule = modulebuilder.configure(module)
.withSerializer(DateTime.class, new DateTimeSerializer())
.withDeserializer(DateTime.class, new DateTimeDeserializer())
.build();

final ObjectMapperBuilder objectMapperBuilder = new ObjectMapperBuilder();
return objectMapperBuilder.configure(mapper).withModule(configuredModule).build();
}
}

工厂方法仍在 Spring 配置中使用,但配置现在实例化空白 ModuleObjectMapper,然后再将它们提供给工厂方法,然后配置它们。

关于java - Jackson ObjectMapper 使用自定义序列化器和反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21706415/

72 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com