将JSON REST Web服务中的日期序列化为ISO-8601字符串

时间:2012-12-10 14:56:29

标签: json jax-rs jboss7.x resteasy

我有一个使用JBoss AS 7.1的JAX-RS应用程序,我有POST / GET JSON和XML对象,其中包括Dates(java.util.Date):

@XmlRootElement
@XmlAccessorType(XmlAccessField.FIELD)
public class MyObject implements Serializable
{
    @XmlSchemaType(name = "dateTime")
    private Date date;
    ...
}

当我在get方法上使用@Produce(“application / xml”)时,objets被序列化为XML并且日期被转换为ISO-8601字符串(例如“2012-12-10T14:50:12.123 + 02” :00" )

但是,如果我在get方法上使用@Produce(“application / json”),则JSON对象中的日期是时间戳(例如“1355147452530”)而不是ISO-8601字符串。

如何配置JAX-RS实现(RESTEasy)以JSON格式将日期序列化为ISO-8601字符串而不是时间戳?

感谢您的回答。

注意:我还尝试使用自定义JAX-RS提供程序为日期执行JSON序列化

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJsonDateProvider implements MessageBodyWriter<Date>
{
    ...
}

此提供程序似乎是由RESTeasy在JBoss初创公司注册的:

[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider
...
[org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector.

但它从未使用过!

4 个答案:

答案 0 :(得分:10)

我假设你的json解析器是Jackson,试试:

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

(自杰克逊2.0以来)

答案 1 :(得分:2)

默认的JBoss解析器是Jettison,但是我无法更改日期格式。所以我切换到Jackson并将以下类添加到我的项目中进行配置:

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

答案 2 :(得分:1)

对不起大声喊叫的人 - 我在这里找到了答案

http://wiki.fasterxml.com/JacksonFAQDateHandling

这里

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

这里

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

这里

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

使用@JsonSerialize(使用= ...)方式:

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

答案 3 :(得分:0)

声明Soap / XML使用的Serializer

@XmlElement(name = "prealert_date")
@XmlSchemaType(name = "dateTime")
@JsonSerialize(using = XMLGregorianCalendarSerializer.class)
protected XMLGregorianCalendar prealertDate;