尽管有@JsonDeserializer注释,但不调用自定义反序列化器

时间:2014-01-06 17:20:32

标签: java json datetime serialization jackson

我在杰克逊和泽西岛使用Java。 使用Web API我试图通过JSON文件发送POJO,该文件也包含Joda DateTime对象。 因为那不是本机对象,所以我为它构建了一个自定义序列化器和反序列化器。但是,因为deserialiser似乎不起作用,我发送一个POST请求,但它没有在服务器上收到。当然,当我从JSON移动日期字段时,它可以很好地工作。

发送的JSON:

{"loc": [-0.1300836,51.5124623],
 "visibility":"Public",
 "date": "06 January 2014 09:51"}

接收它的POST方法:

@POST
@Timed
public String createTadu(@Valid Tadu tadu) throws JsonParseException, JsonMappingException, IOException {
    Tadu createdTadu = new Tadu(tadu);
    taduCollection.insert(createdTadu);
    return String.format("{\"status\":\"success\", \"id\":\"%s\"}", tadu.getId());
}

POJO DateTime声明:

private DateTime date;
@JsonSerialize(using = CustomDateSerializer.class)
public DateTime getDate() {
    return date;
}
@JsonDeserialize(using = CustomDateDeserializer.class)  
public void setDate(DateTime date) {
    this.date = date;
}

和自定义序列化/反序列化器:

public class CustomDateSerializer extends JsonSerializer<DateTime> {

    private static DateTimeFormatter formatter = DateTimeFormat
        .forPattern("dd MMMM yyyy HH:mm"); // 31 December 2013 16:22

    @Override
    public void serialize(DateTime value, JsonGenerator gen,
        SerializerProvider arg2) throws IOException,
        JsonProcessingException {

        gen.writeString(formatter.print(value));
    }
}

public class CustomDateDeserializer extends JsonDeserializer<DateTime>
{
    @Override
    public DateTime deserialize(JsonParser jsonparser,
        DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {

        DateTimeFormatter formatter = DateTimeFormat.forPattern("dd MMMM yyyy HH:mm");
        String date = jsonparser.getText();
        return formatter.parseDateTime(date);

    }
}

我很清楚POST方法(createTadu)没有被调用,因为名为“date”的String是通过JSON发送的,但它不是有效的Tadu对象,因为它不是名为“date”的DateTime 。我希望自定义反序列化器注释可以解决这个问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

我无法理解为什么这种方法不起作用。我最终下载了jackson-datatype-joda模块。

此模块的唯一问题是它不允许使用日期时间的自定义格式化程序,并且只能使用ISO 8601。

另一个问题是,在数据库中,日期时间被转换为纪元UTC时间,最后添加了4个零(为什么是零...)。因此,当将其提取回客户端时,需要完成从纪元到可呈现日期的转换。