【问题标题】:custom deserializer isn't called despite the @JsonDeserializer annotation尽管有 @JsonDeserializer 注释,但未调用自定义反序列化器
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      相关资源
      最近更新 更多