2

Quick Intro (can be skipped) : Hi, there's a lot of questions and answers about this topic, but sometimes the solution is so simple that you just don't even think about, and because I've lost a lot of time I want to post a complement to all answers.

Problem : You have a JSON REST service that handles POST requests to save a JSON object, but that object contains a Date field that is not parsed out-of-the-box by Genson.

The Java Object :

public class MyObj {

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

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

The REST service with Jersey :

@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();
    }
}

The client in javascript with 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'
});
Karl.S
  • 2,294
  • 1
  • 26
  • 33
  • 1
    BTW, Genson works with constructors that take arguments too. Just enable it via GensonBuilder.useConstructorWithArguments(true) – eugen Jul 07 '15 at 11:41

1 Answers1

4

SOLUTION :

Genson provides an easy way to define how dates are (de)serialized, this is the solution you can find everywhere :

@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;
    }
}

IMPORTANT :

If the solution above is not working, be sure that the Date type of the field in your Java Object is the one imported with :

import java.util.Date;

and not :

import java.sql.Date;

I figured it out by myself, but didn't find it anywhere on StackOverflow, it's a stupid error so simple that you could not think about (like me), I hope it'll help someone.

Karl.S
  • 2,294
  • 1
  • 26
  • 33