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é !
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)
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;
}
}
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);
}
}
Déclarer le même Serializer
utilisé par Soap / XML:
@XmlElement(name = "prealert_date")
@XmlSchemaType(name = "dateTime")
@JsonSerialize(using = XMLGregorianCalendarSerializer.class)
protected XMLGregorianCalendar prealertDate;