【发布时间】:2014-01-06 17:20:31
【问题描述】:
我在 Java 中使用 Jackson 和 Jersey。 使用 Web API,我试图通过一个 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 日期时间声明:
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 .我希望自定义反序列化器注释可以解决这个问题。 谢谢!
【问题讨论】:
标签: java json datetime serialization jackson