首页 > 解决方案 > 如果一个java pojo被声明为一个对象,如何根据运行时类型控制jackson序列化?

问题描述

例如,如果我声明Map<String,Object>带有混合类型值集的 a 并尝试使用 custom 序列化TypeResolverBuilder,则我无权访问该值的运行时类型。

但是,如果我想为某些值而不是其他值编写类型信息,那如何实现呢?我一直在阅读DefaultSerializerProvider,它似乎忽略了运行时类型,只使用 JavaType(即 Object.class)

我们正在使用杰克逊 2.9

标签: javaspringjackson

解决方案


如果您能够在需要控制输出的地方编辑 POJO,您应该能够扩展JsonSerializer并且只在 serialize 方法的输出中写入您想要的信息。

您还可以注释您的地图以提供自定义序列化程序并使用以下方法查询要序列化的对象instanceof

@JsonSerialize(keyUsing = SpecialSerializer.class) 
Map<String, Object> map;

然后在你的序列化器中:

 @Override
    public void serialize(Object value, 
      JsonGenerator gen,
      SerializerProvider serializers) 
      throws IOException, JsonProcessingException {
           if(value instanceof MySpecialObject){

                 //special logic here
          }
    }

推荐阅读