如何在Jackson序列化期间忽略空的可选字段

vuktfyat  于 7个月前  发布在  其他
关注(0)|答案(3)|浏览(74)

如果Optional字段的值为空,则在序列化期间忽略该字段的值。
Employee.java

class Employee {

private String firstName;

private String secondName;

public Optional<String> getFirstName() {
    return Optional.ofNullable(firstName);
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public Optional<String> getSecondName() {
    return Optional.ofNullable(secondName);
}
public void setSecondName(String secondName) {
    this.secondName = secondName;
}
}

已将Jackson配置如下:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(objectMapper.writeValueAsString(employee));

序列化方法给出以下输出:

{"firstName":"foo", "secondName":null}

但我们想要的结果如下:

{"firstName":"foo"}
w41d8nur

w41d8nur1#

Optionaljavadoc声明:
Optional主要用于在明确需要表示“无结果”以及使用null可能导致错误的情况下用作方法返回类型。
换句话说,您首先不应该在这里使用Optional
但是,如果您仍然想这样做,@JsonInclude(NON_ABSENT)(doc)应该可以正常工作。

ax6ht2ek

ax6ht2ek2#

您可以创建自定义序列化程序:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Optional;

public class EmployeeSerializer extends JsonSerializer<Employee> {
    @Override
    public void serialize(Employee employee, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        
        employee.getFirstName().ifPresent(firstName -> {
            try {
                jsonGenerator.writeStringField("firstName", firstName);
            } catch (IOException e) {
                e.printStackTrace(); // Handle the exception
            }
        });

        employee.getSecondName().ifPresent(secondName -> {
            try {
                jsonGenerator.writeStringField("secondName", secondName);
            } catch (IOException e) {
                e.printStackTrace(); // Handle the exception
            }
        });

        jsonGenerator.writeEndObject();
    }
}

然后将此注解添加到Employee类中:

@JsonSerialize(using = EmployeeSerializer.class)

您可以在这里阅读更多内容:https://www.baeldung.com/jackson-custom-serialization
希望能帮上忙!

yvgpqqbh

yvgpqqbh3#

重写消息转换器以配置全局序列化设置

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    
    /**/
    
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
        while (iterator.hasNext()) {
            HttpMessageConverter<?> next = iterator.next();
            if (next instanceof MappingJackson2HttpMessageConverter jackson2HttpMessageConverter) {
                ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
                objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            } else if (next instanceof MappingJackson2XmlHttpMessageConverter) {
                iterator.remove();
            }
        }
    }

    /**/

}

相关问题