【问题标题】:CsvMapper Serialize Null Fields as Literal nullCsvMapper 将 Null 字段序列化为 Literal null
【发布时间】:2021-04-29 03:46:30
【问题描述】:

我希望 CsvMapper 将空实例字段映射为文字空值(如所需输出中所示)。例如:

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(Pojo.class);
        ObjectWriter writer = mapper.writer(schema.withUseHeader(true));
        Pojo pojo = new Pojo();
        pojo.setFirstName("John");
        pojo.setLastName(null);
        String csv = writer.writeValueAsString(pojo);
        System.out.println(csv);
    }

    @Data
    public static class Pojo {
        private String firstName;
        private String lastName;
    }
}

实际输出

firstName,lastName
John,

期望的输出

firstName,lastName
John,null

【问题讨论】:

    标签: jackson objectmapper jackson-databind


    【解决方案1】:

    找到更好的答案

    CsvSchema schema = mapper.schemaFor(Pojo.class).withNullValue("null");
    

    【讨论】:

      【解决方案2】:

      深入研究CsvMapper 代码,发现它使用DefaultSerializerProvider

      因此我用自定义 JsonSerializer 覆盖了 nullSerializer

      public class CustomNullSerializer extends JsonSerializer<Object> {
          public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
              jgen.writeString("null");
          }
      }
      

      然后修改CsvMapper

      CsvMapper mapper = new CsvMapper();
      DefaultSerializerProvider.Impl sp = new DefaultSerializerProvider.Impl();
      sp.setNullValueSerializer(new CustomNullSerializer());
      mapper.setSerializerProvider(sp);
      

      【讨论】:

        猜你喜欢
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-23
        • 2020-06-30
        相关资源
        最近更新 更多