2010-06-16 12 views
7

Ich benutze Jersey (jax-rs), um eine REST reiche Anwendung zu erstellen.JAX-RS JSON java.util.Date Unmarshall

Alles ist großartig, aber ich verstehe nicht wirklich, wie man die JSON Marshalling/Unmarshalling Optionen für Daten und Zahlen konfiguriert.

Ich habe eine User-Klasse:

@XmlRootElement 
public class User { 
    private String username; 
    private String password; 
    private java.util.Date createdOn; 

    // ... getters and setters 
} 

Wenn die createdOn Eigenschaft serialisiert wird, erhalte ich eine Zeichenfolge wie folgt: '2010-05-12T00: 00: 00 + 02: 00', aber ich brauche um ein bestimmtes Datumsmuster zu verwenden, um sowohl Termine zu mars- als auch zu unmarshalen.

Weiß jemand, wie man das macht?

Antwort

2

Was Sie bekommen, ist ein Datum ISO 8601-Format, das ein Standard ist. Jersey wird es für Sie auf dem Server analysieren. Für Javascript hier ist ein extension to js date das zu analysieren.

+0

Dankten zu deiner Antwort! Ok für die Javascript-Erweiterung, aber ich weiß, um den Marshall zu steuern, unmarshall Prozess. Wissen Sie, wo Jersey verlängert wird? Vielen Dank, Davide – Davide

+0

Link ist seit dem gestorben. –

16

Sie einen XMLAdapter schreiben konnte:

Ihre besondere XMLAdapter aussehen würde etwas:

import java.util.Date; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class JsonDateAdapter extends XmlAdapter<String, Date> { 

    @Override 
    public Date unmarshal(String v) throws Exception { 
     // TODO convert from your format 
    } 

    @Override 
    public String marshal(Date v) throws Exception { 
     // TODO convert to your format 
    } 

} 

Dann auf Ihrem Datum Eigenschaft die folgende Anmerkung gesetzt:

@XmlJavaTypeAdapter(JsonDateAdapter.class) 
public getDate() { 
    return date; 
} 
1

Wenn Sie möchten, mit den Adaptern nicht zu spielen oder Sie benötigt benutzerdefinierte für verschiedene Objekte Rangier- und wollen alltogether die Adapter vermeiden, könnten Sie auch mit den Attributen und der Bohne Muster spielen:

private Date startDate; 

@XmlTransient 
public Date getStartDate() { 
    return startDate; 
} 
public void setStartDate(Date startDate) { 
    this.startDate = startDate; 
} 
@XmlElement public String getStrStartDate() { 
    if (startDate == null) return null; 
    return "the string"; // the date converted to the format of your choice with a DateFormatter"; 
} 
public void setStrStartDate(String strStartDate) throws Exception { 
    this.startDate = theDate; // the strStartDate converted to the a Date from the format of your choice with a DateFormatter; 
} 
+0

Nach ein paar Entwicklungstagen nutze ich beide, eine leistungsstarke js-Bibliothek (http://www.datejs.com/), um Daten vom und zum Server zu konvertieren, im ISO-8601-Format und bei Bedarf auch I nutze deine Arbeit. Die Notwendigkeit kommt, wenn es eine andere Zeitzone zwischen Client zu Server gibt. In gewisser Weise wird Date automatisch berechnet, wobei der Unterschied zwischen Local Time und GMT verwendet wird. Ein großes Problem, wenn Sie ein Datum benötigen, das bis Mitternacht gespalten ist ... – Davide

+1

@Davide Ich fand die [joda-time] (http://joda-time.sourceforge.net/) Bibliothek nützlich, um Daten in verschiedenen Stringformaten zu analysieren und um die letzte Mitternacht um/vor einem bestimmten Zeitstempel zu berechnen. –