Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 停止Jackson自定义日期序列化程序写入空值_Java_Json_Jackson - Fatal编程技术网

Java 停止Jackson自定义日期序列化程序写入空值

Java 停止Jackson自定义日期序列化程序写入空值,java,json,jackson,Java,Json,Jackson,我使用Jackson来处理JSON,我有一个自定义的日期序列化程序,用于以我想要的方式格式化日期,但它不符合@JsonSerialize(include=Inclusion.NON_NULL)注释。下面是序列化程序 如果日期为空,它仍然会被写入。如果我不使用自定义序列化程序,一切正常,就不会写入空值。我的问题是,JsonSerializer类中是否需要执行某些操作来停止编写空值 public class DateSerializer extends JsonSerializer<Date&

我使用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));
    }
}
公共类DateSerializer扩展JsonSerializer
{
@凌驾
public final void serialize(日期日期、JsonGenerator jgen、SerializerProvider提供程序)引发IOException、JsonProcessingException
{
SimpleDataFormat sdf=新的SimpleDataFormat(MY_格式);
jgen.writeString(sdf.format(date));
}
}

结果表明,它根本不是序列化程序,而是@JsonSerialize注释,默认为include=ALWAYS,它覆盖了类上的include=NON_NULL。因此,更改getter的注释是有效的:

更改:

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


似乎从2.1.4到2.4.2,该行为已被修复,且具有一般性

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

现在就可以了。

您可以为自定义日期格式创建序列化程序/反序列化程序

对于反序列化程序:

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 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);
    }
}
@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;

}