2

Quick Intro(可以跳过): 嗨,关于这个话题有很多问题和答案,但有时解决方案很简单,你甚至都没有想到,因为我已经失去了很多我想要的时间发布所有答案的补充。

问题: 您有一个 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();
    }
}

带有 jQ​​uery 的 javascript 客户端:

// 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'
});
4

1 回答 1

4

解决方案 :

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;

我自己想通了,但在 StackOverflow 上的任何地方都没有找到,这是一个愚蠢的错误,如此简单以至于你无法想到(像我一样),我希望它会对某人有所帮助。

于 2015-07-07T03:24:03.880 回答