Jackson使用定制序列化程序和反序列化程序的对象映射器

原学程将引见Jackson应用定制序列化法式以及反序列化法式的对于象映照器的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Jackson使用定制序列化程序和反序列化程序的对象映射器 教程 第1张

成绩描写

我有1个设置装备摆设Jackson对于象映照器的类。它为我的对于象典型添减了1些定制的序列化法式以及反序列化法式,以下所示:

public class JsonMapperFactory {
 public static ObjectMapper createObjectMapper() {
  final SimpleModule module = new SimpleModule("customerSerializationModule", new Version(一, 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类时,我试图简略天检讨所创立的对于象映照器能否具备预期的序列化法式(或者反序列化法式)这不妨经由过程自省对于象映照器去完成,但是它仿佛出有所有体制去完成这1面。

有人晓得尝试它的佳办法吗?

关于反序列化法式,我有以下多少面:

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 :(
}

,它异常简短,而且应用过期的办法。

我借出有找到为序列化法式履行相似尝试的办法。是以,我今朝已乞助于序列化对于象并检讨其序列化能否准确(本质上复制了序列化法式尝试)

迎接您提出所有设法主意。

推举谜底

依据这里供给的谜底以及正文,我比来从新安排了类,以就同时应用Module以及ObjectMapper的建立器。这使我可以或许供给模仿并检讨能否向模块添减了准确的(反)序列化法式,而后如预期的这样将模块注册到对于象映照器。

对于象映照器死成器:

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设置装备摆设中应用,但是设置装备摆设如今虚例化空缺Module以及ObjectMapper,而后将它们供给给随后设置装备摆设它们的工场办法。

佳了闭于Jackson应用定制序列化法式以及反序列化法式的对于象映照器的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。