如何覆盖Jackson2.0中的空序列化程序?

mgdq6dx1  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(111)

我使用Jackson进行JSON序列化,并且我希望覆盖null序列化器--具体地说,以便null值在JSON中被序列化为空字符串,而不是字符串“null”。
我找到的所有关于如何设置空序列化程序的文档和示例都引用了Jackson1.x --例如,http://wiki.fasterxml.com/JacksonHowToCustomSerializers底部的代码不再用Jackson 2.0编译,因为StdSerializerProvider不再存在于该库中。该网页描述了Jackson 2.0的模块接口,但该模块接口没有明显的方法来覆盖空序列化程序。
有人能提供一个指针,说明如何覆盖Jackson2.0中的空序列化程序吗?

rsaldnfx

rsaldnfx1#

重写JsonSerializer序列化方法,如下所示。

public class NullSerializer extends JsonSerializer<Object> {
  public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    // any JSON value you want...  
    jgen.writeString("");
  }
}

那么您可以将NullSerializer设置为自定义对象Map器默认值:

public class CustomJacksonObjectMapper extends ObjectMapper {

public CustomJacksonObjectMapper() {
    super();
    DefaultSerializerProvider.Impl sp = new DefaultSerializerProvider.Impl();
    sp.setNullValueSerializer(new NullSerializer());
    this.setSerializerProvider(sp);
  }
}

或者使用@JsonSerialize注解为某些属性指定它,例如:

public class MyClass {

  @JsonSerialize(nullsUsing = NullSerializer.class)
  private String property;
}
blmhpbnm

blmhpbnm2#

我无法得到可接受的答案来为我工作。也许是因为我的ObjectMapper在我的环境中是一个Spring Bean。
我通过使用SimpleModule进行了恢复。相同的序列化程序:

public class NullSerializer extends JsonSerializer<Object> {
      public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        // any JSON value you want...  
        jgen.writeString("");
      }
    }

注解位于Mixin中,因为我没有修改MyClass的权限:

public abstract class MyClassMixin {
    @JsonSerialize(nullsUsing = NullSerializer.class)
    public String property;
}

为了将序列化程序附加到Map器,我在Spring组件中使用了一个模块:

@AutoWired
ObjectMapper objectMapper;

@PostConstruct
public void onPostConstruct() {
    SimpleModule module = new SimpleModule();
    module.setMixInAnnotation(MyClass.class, MyClassMixin.class);
    objectMapper.registerModule(module);
}

相关问题