2

我正在使用 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));
    }
}
4

3 回答 3

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;
}
于 2013-05-15T02:17:16.713 回答
0

似乎从 2.1.4 到 2.4.2,此行为已被修复并且一般

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

现在就行了。

于 2014-09-15T13:08:03.607 回答
-1

您可以为您的自定义日期格式创建一个 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;

}
于 2017-10-10T17:13:44.937 回答