我在用杰克森和泽西在爪哇。使用web,我试图通过一个JSON文件发送一个POJO,该文件还包括一个Joda DateTime对象。因为这不是一个本机对象,所以我为它构建了一个自定义序列化程序和反序列化器。但是,由于反序列化器似乎不起作用,我发送了一个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“的字符串是通过JSON发送的,但是它不是一个有效的Tadu对象,因为它不是一个名为"date”的DateTime。我希望自定义反序列化器注释能够修复这个问题。谢谢!
发布于 2014-01-08 08:41:53
我不明白为什么这个方法行不通。最后我下载了杰克森-数据类型-joda模块。
这个模块的唯一问题是它还不允许自定义的日期时间格式化程序,并且只在ISO 8601中运行。
另一个问题是,在数据库中,日期时间被转换为一个划时代的UTC时间,最后添加了4个零(为什么是零..)。因此,当将其带回客户端时,需要完成从划时代到可显示日期的转换。
https://stackoverflow.com/questions/20955527
复制