序列化日期以JSON REST Web服务作为ISO-8601字符串(Serialize Date

2019-07-04 20:55发布

我有使用JBoss AS 7.1 JAX-RS应用程序,并且我POST / GET JSON和XML对象包括日期(java.util.Date):

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

当我在GET方法使用@Produce( “应用程序/ XML”),则OBJETS序列化为XML和日期转换成ISO-8601的字符串(例如, “2012-12-10T14:50:12.123 + 02:00” )。

不过,如果我对get方法使用@Produce(“应用/ 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.

但从来没有使用过!

Answer 1:

我想你的JSON解析器是杰克逊,尝试:

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

(自杰克逊2.0)



Answer 2:

默认的JBoss解析器抛弃,但我无法更改日期格式。 所以我切换到杰克逊并添加下面的类到我的项目进行配置:

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


Answer 3:

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

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


Answer 4:

声明相同的Serializer通过SOAP / XML使用:

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


文章来源: Serialize Date in a JSON REST web service as ISO-8601 string