Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 配置Jackson以支持自定义序列化程序类的SerializationInclusion配置_Java_Json_Spring_Serialization_Jackson - Fatal编程技术网

Java 配置Jackson以支持自定义序列化程序类的SerializationInclusion配置

Java 配置Jackson以支持自定义序列化程序类的SerializationInclusion配置,java,json,spring,serialization,jackson,Java,Json,Spring,Serialization,Jackson,当自定义序列化程序类创建空字段时,我在试图让Jackson从生成的JSON中正确删除空字段时遇到了一个相当有趣的问题。我已经非常彻底地搜索了有关序列化程序和SerializationInclusion配置的信息,但是我没有找到任何可以解释我所看到的内容的东西 我配置了一个Jackson对象映射器,并通过Spring自动连接。对象映射器配置和POJO(为简洁起见进行了编辑)看起来或多或少像下面的代码 出于某种原因,当我调用REST端点以获取包含上述示例值的Bar对象时,我看到以下行为: Seri

当自定义序列化程序类创建空字段时,我在试图让Jackson从生成的JSON中正确删除空字段时遇到了一个相当有趣的问题。我已经非常彻底地搜索了有关序列化程序和SerializationInclusion配置的信息,但是我没有找到任何可以解释我所看到的内容的东西

我配置了一个Jackson对象映射器,并通过Spring自动连接。对象映射器配置和POJO(为简洁起见进行了编辑)看起来或多或少像下面的代码

出于某种原因,当我调用REST端点以获取包含上述示例值的Bar对象时,我看到以下行为:

  • SerializationInclusion设置将应用于所有本身为空或null的属性(名称、列表、对象)
  • SerializationInclusion设置未应用于任何由自定义序列化程序类设置为null的属性,我们将返回存在null值的JSON

我在这里的想法是,在Jackson已经从JSON中删除了所有null和空值之后,就会调用序列化程序逻辑,因此“foo”属性被正确设置为null,但不会被删除,因为包含逻辑已经执行

有人对这里可能发生的事情有什么想法吗?在版本2.2.2中如何实现Jackson数据绑定库,这是一个怪癖吗


杰克逊配置-

@Bean
public JacksonObjectMapper jacksonMapper() {
    final JacksonObjectMapper mapper = new JacksonObjectMapper();

    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
    mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
    mapper.registerModule(agJacksonModule());

    return mapper;
}

@Bean
public SimpleModule agJacksonModule() {
    final SimpleModule module = new SimpleModule();

    module.addSerializer(Foo.class, new FooSerializer());

    return module;
}
自定义序列化程序-

public class FooSerializer extends JsonSerializer<Foo> {

@Override
public void serialize(Sponsor sponsor, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
        throws IOException {

    // write null value for sponsor json property, if sponsor object has all empty or null fields
    if(sponsor == null || isObjectEmpty(sponsor)) {
        jsonGenerator.writeNull();
        return;
    }

    // write out object
    jsonGenerator.writeStartObject();
    jsonGenerator.writeStringField("imgUrl", sponsor.getImgUrl());
    jsonGenerator.writeStringField("clickUrl", sponsor.getClickUrl());
    jsonGenerator.writeStringField("sponsorName", sponsor.getSponsorName());
    jsonGenerator.writeStringField("sponsorText", sponsor.getSponsorText());
    jsonGenerator.writeEndObject();

}

private boolean isObjectEmpty(Sponsor sponsor) {
    return Strings.isNullOrEmpty(sponsor.getClickUrl())
            && Strings.isNullOrEmpty(sponsor.getImgUrl())
            && Strings.isNullOrEmpty(sponsor.getSponsorName())
            && Strings.isNullOrEmpty(sponsor.getSponsorText());
}
福波乔-

public abstract class Foo {

    protected String aString = "";
    protected String bString = "";
    protected String cString = "";
    protected String dString = "";

    // some getters and setters for the above properties
}

重写并实现JsonSerializer的isEmpty方法以实现您想要的

对于emptymeans的自定义定义,JsonSerializer实现需要覆盖此方法:

public boolean isEmpty(SerializerProvider provider, T value);

注意,调用方在写入字段名时必须处理过滤;只有在需要实际序列化的情况下才会调用序列化程序。

我知道这很旧,但您使用自定义序列化程序解决了这个问题吗?希望避免到处开支票。。。
public boolean isEmpty(SerializerProvider provider, T value);