我使用Jackson来处理JSON,我有一个自定义日期序列化程序,用于按照我想要的方式格式化日期,但它没有遵守@JsonSerialize(include = Inclusion.NON_NULL)注释。序列化器在下面。
如果日期为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));
}
}
答案 0 :(得分:1)
原来它根本不是序列化器,但是@JsonSerialize注释默认包含= ALWAYS,它会覆盖类上的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;
}
答案 1 :(得分:0)
似乎从2.1.4到2.4.2这个行为已经修复并且是一般的
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
立即行动。
答案 2 :(得分:-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;
}
}
对于Serializer:
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;
}