6

WRT to the following question:

Jersey + Jackson JSON date format serialization - how to change the format or use custom JacksonJsonProvider.

I wish to know

  • Is Jackson specifying that the json date format should be normalised to a unix time integer?

Follow-up questions ...

  • Has there been a change in its stance anytime recently?
  • Shouldn't a date format be normalised to the same format provided by jaxb xml output?
  • why/why not?
  • any effort put into resolving this issue?
  • has RestEasy provided a json provider mitigation that would output json date in a generally recognisable date format?
Community
  • 1
  • 1
Blessed Geek
  • 21,058
  • 23
  • 106
  • 176

2 Answers2

12

Sorry people for yelling out loud - I found the answers here

http://wiki.fasterxml.com/JacksonFAQDateHandling,

here

http://wiki.fasterxml.com/JacksonFAQ#Serializing_Dates,

here

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

here

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/util/StdDateFormat.html

Using the @JsonSerialize(using= ... ) way:

public class JsonStdDateSerializer
extends JsonSerializer<Date> {
  private static final DateFormat iso8601Format =
    StdDateFormat.getBlueprintISO8601Format();

  @Override
  public void serialize(
    Date date, JsonGenerator jgen, SerializerProvider provider)
  throws IOException, JsonProcessingException {

    // clone because DateFormat is not thread-safe
    DateFormat myformat = (DateFormat) iso8601Format.clone();
    String formattedDate = myformat.format(date);
    jgen.writeString(formattedDate);
  }
}
Blessed Geek
  • 21,058
  • 23
  • 106
  • 176
  • 3
    Someone downvoted this answer. Care to explain why? I don't quite like the answer myself, but those are the recommended way around it. You can't blame me or my answer for the existence of a disagreement between jaxb and jackson. You would have to take your rant out on those two orgs. – Blessed Geek Feb 08 '13 at 16:45
2

This is also controlled by a feature on the ObjectMapper (at least in 1.9.11, and possibly earlier):

ObjectMapper om = new ObjectMapper();
om.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
om.writer().writeValue(System.out, objectWithDateProperty);

I don't see how to declaratively do the equivalent on the object definition itself.

Ross Judson
  • 1,132
  • 5
  • 11