2012-12-10 7 views
15

Ich habe eine JAX-RS-Anwendung mit JBoss AS 7.1, und ich POST/GET JSON und XML-Objekten, die Daten (java.util.Date) schließen ein:Serialize Datum in einem JSON REST Web Service als ISO-8601-String

Wenn ich @Produce ("application/xml") für die Methode get verwende, werden die Objekte als XML serialisiert und die Daten in ISO-8601-Strings konvertiert (z. B. "2012-12-10T14: 50: 12.123 +02: 00 ").

Wenn jedoch @Produce ("application/json") für die get-Methode verwendet wird, sind die Daten in den JSON-Objekten Zeitstempel (z. B. "1355147452530") anstelle von ISO-8601-Zeichenfolgen.

Wie kann ich die JAX-RS-Implementierung (RESTEasy) konfigurieren, um Datumsangaben im JSON-Format als ISO-8601-Strings anstelle von Zeitstempeln zu serialisieren?

Vielen Dank für Ihre Antworten.

Anmerkung: Ich habe auch versucht, eine benutzerdefinierte JAX-RS-Provider zu verwenden, um die JSON-Serialisierung für Termine

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

Dieser Anbieter zu tun scheint von Resteasy auf JBoss Startup registriert werden:

[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. 

aber es wird nie benutzt!

Antwort

8

Ich gehe davon aus Ihrem json Parser Jackson, versuchen:

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

(seit Jackson 2.0)

2

Der Standard JBoss-Parser ist Jettison, aber ich war das Datum zu ändern Format nicht in der Lage. Also habe ich zu Jackson geschaltet und hinzugefügt, um die folgenden Klasse zu meinem Projekt zu konfigurieren:

@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

Meine JBoss EAP 7 JAX-RS implentation ist und Resteasy Ich habe‘ Ich möchte eine Jackson-Abhängigkeit hinzufügen. Nach einem Tag Recherche habe ich Ihre Lösung gefunden ('JacksonConfig'). Ich habe Maven Abhängigkeit ' com.fasterxml.jackson.core jackson-databind 2.8.7' und verwenden ein benutzerdefiniertes Datumsformat 'objectMapper.setDateFormat (neu Simple (" dd.MM.yyyy "))' anstatt der Standard-Einstellung mit 'objectMapper.configure()' –

1

Leider Menschen schreien laut - ich fand die Antworten hier

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

hier

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

hier

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

hier

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

Mit dem @JsonSerialize (mit = ...) Art und Weise:

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