Serialize Date in a JSON REST web service as ISO-8601 string

前端 未结 4 1887
星月不相逢
星月不相逢 2020-12-18 18:31

I have a JAX-RS application using JBoss AS 7.1, and I POST/GET JSON and XML objects which include Dates (java.util.Date):

@XmlRootElement
@XmlAccessorType(Xm         


        
相关标签:
4条回答
  • 2020-12-18 19:10

    The default JBoss parser is Jettison, but I wasn't able to change the date format. So I switched to Jackson and added the following class to my project to configure it:

    @Provider
    @Produces(MediaType.APPLICATION_JSON)
    public class JacksonConfig implements ContextResolver<ObjectMapper>
    {
        private final ObjectMapper objectMapper;
    
        public JacksonConfig()
        {
            objectMapper = new ObjectMapper();
            objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESPAMPS, false);
        }
    
        @Override
        public ObjectMapper getContext(Class<?> objectType)
        {
            return objectMapper;
        }
    }
    
    0 讨论(0)
  • 2020-12-18 19:14

    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);
      }
    }
    
    0 讨论(0)
  • 2020-12-18 19:21

    Declare the same Serializer used by Soap/XML:

    @XmlElement(name = "prealert_date")
    @XmlSchemaType(name = "dateTime")
    @JsonSerialize(using = XMLGregorianCalendarSerializer.class)
    protected XMLGregorianCalendar prealertDate;
    
    0 讨论(0)
  • 2020-12-18 19:35

    I assume your json parser is Jackson, try:

    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
    public Date date;
    

    (since Jackson 2.0)

    0 讨论(0)
提交回复
热议问题