2016-04-04 11 views
0

Ich habe versucht, einen JSON-String mit Datum desalinize aber ich folgende exception-Kann nicht konstruieren Instanz java.util.Date von String-Wert ‚/ Datum (1458672480000) /‘

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '/Date(1458672480000)/': not a valid representation (error: Unparseable date: "/Date(1458672480000)/" (at offset 0)) 
at [Source: [email protected]; line: 1, column: 199] 

bekommen Code Details wie unten-

DataModel-

@JsonIgnoreProperties(ignoreUnknown = true) 
    public class DataModel { 
     public Integer Capacity; 
     public Long Id; 
     public String Name; 
     public Date StartDate; 
     public Date EndDate; 
     public String Message; 
     public Integer LocationId; 
     public Boolean IsValid; 
     public Integer[] NickNames = new Integer[0]; 

    } 

JSON Saiten-

{"d":[{"__type":"my.package.name.className","Id":1,"Name":"xxx","PlaceId":2,"Message":"","IsValid":false,"NickNames":[],"StartDate":"\/Date(1458672480000)\/","EndDate":"\/Date(1458689400000)\/","Size":0,"StringStartDate":"2016-03-22T14:48:00-04:00","StringEndDate":"2016-03-22T19:30:00-04:00"}]} 

De-Serialisierung code-

ObjectMapper mapper = new ObjectMapper(); 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
mapper.setDateFormat(dateFormat); 
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
TypeReference<HashMap<String,DataModel[]>> typeRef= new TypeReference<HashMap<String,DataModel[]>>(){}; 
HashMap<String,DataModel[]> newSessions = mapper.readValue(data, typeRef); 

Gibt es irgendein Problem in der JSON-String? Wenn nicht, was ist der richtige Weg, um es zu deserialisieren?

+0

1458672480000 anstelle des Datums (1458672480000)? – null

+0

Sie haben ein Feld namens '' StringStartDate'' in Ihrem json, das die Daten genau so enthält, wie Sie es erwarten. Dieses Feld tritt jedoch nicht in Ihrem DataModel auf. Das '' StartDate''-Feld in Ihrem json enthält ungültigen Inhalt und kann daher nicht in '' java.util.Date'' deserialisiert werden. – f1sh

Antwort

1

Der Konstruktor für ein neues Objekt Date ist Date(long millis). Aber du gibst diesen String hinein - "Date(1458672480000)".

Erhalten Sie den langen Wert aus diesem String und erstellen Sie dann das Objekt Date. Angenommen, Ihr startdate ist "Date(1458672480000)" dann -

Date d = new Date(Long.parseLong(startDate.substring(5, 18))); 

Hier haben wir den numerischen Teil des String extrahieren und es zu long Typ zu konvertieren.

Idealerweise wäre es besser, wenn Ihr Server Ihnen den Wert long direkt sendet, so dass Sie ihn nicht analysieren müssen. Ihr Code hätte perfekt funktioniert, wenn der long Datumswert direkt in JSON kommen würde - "startDate": 1458672480000.

+0

Der letzte Teil ist der richtige Ansatz. Ich habe noch nie ein Date als "Date (1458672480000)" vorher gesehen. – f1sh

+0

Danke für die Antwort. Die Ausnahme löst diese Zeile aus - HashMap newSessions = mapper.readValue (data, typeRef); ', wobei ** data ** die JSON-Zeichenfolge ist. Nun, wo schreibe ich diese Zeile - "Date d = new Date (Long.parseLong (startDate.substring (5, 18)));'? – JohnC

+1

Ich glaube nicht, dass du es so schaffen kannst. Ihre einzige Möglichkeit ist es, StartDate und EndDate String Typen zu machen. Und wandle sie dann in ein Datum um, wann immer du sie verwenden willst, indem du den Code in meiner Antwort verwendest. ODER nehmen Sie den Rat in meiner letzten Zeile der Antwort –

Verwandte Themen