Serialize Date dans un service JSON REST web en tant que chaîne ISO-8601

j'ai une application JAX-RS utilisant JBoss comme 7.1, et je poste/obtiens des objets JSON et XML qui incluent des Dates (java.util.Date):

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

quand j'utilise @Produce ("application/xml") sur la méthode get, les objets sont sérialisés en XML et les dates sont converties en chaînes ISO-8601 (par exemple "2012-12-10T14:50:12.123+02:00").

cependant, si j'utilise @Produce ("application/json") sur la méthode get, les dates dans les objets JSON sont timestamps (par exemple" 1355147452530") à la place de cordes ISO-8601.

Comment puis-je configurer L'implémentation JAX-RS (RESTEasy) pour sérialiser les dates au format JSON comme des chaînes ISO-8601 au lieu de timestamps ?

Merci pour vos réponses.

Note: j'ai aussi essayé d'utiliser un fournisseur JAX-RS personnalisé pour faire la sérialisation JSON pour les Dates

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

ce fournisseur semble être enregistré par RESTeasy au démarrage de 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.

mais il n'est jamais utilisé !

18
demandé sur Zlika 2012-12-10 18:56:28

4 réponses

je suppose que votre parser json est Jackson, essayez:

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

(depuis Jackson 2.0)

10
répondu Dan 2013-05-22 13:53:28

L'analyseur JBoss par défaut est Jettison, mais je n'ai pas pu changer le format de la date. Je suis donc passé à Jackson et j'ai ajouté la classe suivante à mon projet pour le configurer:

@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
répondu Zlika 2013-05-27 07:48:02

Désolé les gens pour crier à haute voix - j'ai trouvé les réponses ici

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

ici

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

ici

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

ici

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

en utilisant le @JsonSerialize(à l'aide de= ... ):

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);
  }
}
1
répondu Shivendra Prakash Shukla 2015-09-30 11:00:44

Déclarer le même Serializer utilisé par Soap / XML:

@XmlElement(name = "prealert_date")
@XmlSchemaType(name = "dateTime")
@JsonSerialize(using = XMLGregorianCalendarSerializer.class)
protected XMLGregorianCalendar prealertDate;
0
répondu Bertrand RODRIGUES 2018-04-23 15:21:11