使用Genson和Jersey从POST解析JSON日期

时间:2015-07-07 03:24:04

标签: java rest date jersey genson

快速介绍(可以跳过): 嗨,关于这个主题有很多问题和答案,但有时候解决方案很简单,你甚至不会想到,因为我已经失去了很多时间我想对所有答案发布补充。

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

Java对象:

public class MyObj {

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

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

泽西岛的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();
    }
}

使用jQuery的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'
});

1 个答案:

答案 0 :(得分:3)

解决方案:

Genson提供了一种简单的方法来定义日期(de)序列化的方式,这是您可以在任何地方找到的解决方案:

@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的任何地方都没有找到它,这是一个如此简单的愚蠢错误,你无法想到(像我一样),我希望它会有所帮助有人。