我在Java中使用Jackson和Jersey。 使用Web API我想通过也包含Joda DateTime对象的JSON文件发送POJO。 因为这不是一个本地对象,我为它构建了一个自定义序列化器和解串器。但是,因为解串器似乎不起作用,所以我发送一个POST请求,但它在服务器上没有收到。当然,当我从JSON移动日期字段时,它可以很好地工作。即使@JsonDeserializer注释也不会调用自定义反序列化器
的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日期时间声明:
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”的字符串是通过JSON发送的,但它不是一个有效的Tadu对象,因为它不是一个称为“date ”。我希望自定义反序列化器注释能够解决这个问题。 谢谢!