使用 Genson 和 Jersey 解析 JSON 来自 POST 的日期

Parse JSON Date from POST with Genson and Jersey

快速介绍(可跳过): 你好,关于这个话题有很多问题和答案,但有时解决方案很简单,你甚至都没有想到,因为我已经浪费了很多时间,所以我想 post 所有答案的补充。

问题: 您有一个 JSON REST 服务来处理 POST 保存 JSON 对象的请求,但该对象包含一个 Date 字段,Genson 没有开箱即用地对其进行解析。

Java对象:

public class MyObj {

    // The field you want to serialize/deserialize
    private Date date;

    // Constructor with no arguments needed by Genson
    public MyObj() {}
}

Jersey 的 REST 服务:

@Path("/api/my-obj")
public class MyObjAPI {

    @POST
    @Consumes("application/json")
    public Response insert(MyObj myObj) {
        // do what you want with myObj, it's ready to use with the date
        return Response.created('url/to/created/object').build();
    }
}

javascript中的客户与jQuery:

// This is the JSON Object to POST
var myObj = {
    date: new Date()
};

$.ajax({
    method: 'POST',
    url: '/api/my-obj',
    data: JSON.stringify(myObj),
    dataType: 'json',
    processData: false,
    contentType: 'application/json'
});

解决方案:

Genson 提供了一种简单的方法来定义日期的序列化(反)序列化,这是随处可见的解决方案:

@Provider
public class GensonProvider implements ContextResolver<Genson> {

    private final Genson genson = new GensonBuilder()
            .useDateAsTimestamp(false)
            .useDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))
            .create();

    @Override
    public Genson getContext(Class<?> type) {
        return genson;
    }
}

重要提示:

如果上述解决方案不起作用,请确保 Java 对象中字段的日期类型是使用 :

导入的
import java.util.Date;

而不是:

import java.sql.Date;

我自己弄明白了,但在 Whosebug 上找不到任何地方,这是一个愚蠢的错误,非常简单,你无法想到(像我),我希望它能帮助别人。