【问题标题】:Stop Jackson custom Date Serializer writing nulls停止杰克逊自定义日期序列化器写入空值
【发布时间】:2013-05-15 02:07:41
【问题描述】:

我使用 Jackson 来处理 JSON,我有一个自定义日期序列化程序,用于以我想要的方式格式化日期,但它不遵守 @JsonSerialize(include = Inclusion.NON_NULL) 注释。序列化器在下面。

如果日期为空,它仍然会被写入。如果我不使用自定义序列化程序,一切都很好,不会写入空值。我的问题是,JsonSerializer 类中是否需要执行某些操作来停止写入空值?

public class DateSerializer extends JsonSerializer<Date>
{
    @Override
    public final void serialize(Date date, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException
    {
        SimpleDateFormat sdf = new SimpleDateFormat(MY_FORMAT);
        jgen.writeString(sdf.format(date));
    }
}

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    原来它根本不是序列化程序,而是默认为 include=ALWAYS 的 @JsonSerialize 注释,它覆盖了类上的 include=NON_NULL。所以改变 getter 的注解是可行的:

    改变了:

    @JsonSerialize(using = DateSerializer.class)
    public Date getDate()
    {
        return date;
    }
    

    到:

    @JsonSerialize(using = DateSerializer.class,
            include=JsonSerialize.Inclusion.NON_NULL)
    public Date getDate()
    {
        return date;
    }
    

    【讨论】:

    • 你能提供杰克逊的版本吗?有同样的问题,但在自定义序列化结果后无法摆脱空值..
    【解决方案2】:

    似乎从 2.1.4 到 2.4.2 这个行为已经被修复并且是一般的

    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(Include.NON_NULL);
    

    现在就可以了。

    【讨论】:

      【解决方案3】:

      您可以为自定义日期格式创建一个 Serializaer/Deserializer。

      对于反序列化器:

      public class JsonDateDeserializer extends JsonDeserializer<Date> {
      
          private static final SimpleDateFormat dateFormat;
      
          static {
              dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
              dateFormat.setTimeZone(SimpleTimeZone.getTimeZone("UTC"));
          }
      
          @Override
          public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException {
              String date = jsonparser.getText();
              if (date != null && !"".equals(date)) {
                  try {
                      return dateFormat.parse(date);
                  } catch (ParseException e) {
                      throw new JsonParseException(jsonparser, e.getMessage());
                  }
              }
              return null;
          }
      
      }
      

      对于序列化器:

      public class JsonDateSerializer extends JsonSerializer<Date> {
      
          private static final SimpleDateFormat dateFormat;
      
          static {
              dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
              dateFormat.setTimeZone(SimpleTimeZone.getTimeZone("UTC"));
          }
      
          @Override
          public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {
              String formattedDate = dateFormat.format(date);
              gen.writeString(formattedDate);
          }
      }
      

      在你的 POJO 中:

      @Data
      public class Person implements Serializable {
      
          private static final long serialVersionUID = -8041031461422721556L;
      
          private Long id;
      
          private String name;
      
          @JsonSerialize(using = JsonDateSerializer.class)
          @JsonDeserialize(using = JsonDateDeserializer.class)
          private Date dob;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        相关资源
        最近更新 更多