我在杰克逊和泽西岛使用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 。我希望自定义反序列化器注释可以解决这个问题。 谢谢!
答案 0 :(得分:0)
我无法理解为什么这种方法不起作用。我最终下载了jackson-datatype-joda模块。
此模块的唯一问题是它不允许使用日期时间的自定义格式化程序,并且只能使用ISO 8601。
另一个问题是,在数据库中,日期时间被转换为纪元UTC时间,最后添加了4个零(为什么是零...)。因此,当将其提取回客户端时,需要完成从纪元到可呈现日期的转换。