2016-07-11 7 views
0

Ich schreibe eine Fallklasse, die einem JSON-Ergebnis zugeordnet wird, das ich von einer externen API-Antwort erhalte.Welche Datums-/Uhrzeitklasse sollte ich ebenfalls zuordnen?

Die Datumzeit wie folgt aussieht: 2016-05-30T00:23:27.070Z

Welche soll ich auf diese Datetime-Zeichenfolge zur Karte verwenden?

Ich möchte playframework die json AutoMapper verwenden, so kann ich nur tun:

implizite val userReads = Json.reads [Benutzer]

case class User(createdAt: ?????) 
+0

Die Datums- und Uhrzeitformat Sie sind beziehe ist ein ISO 8601. https://en.wikipedia.org/wiki/ISO_8601 – Daniel

Antwort

2

Es gibt bereits vordefinierte Format für Daten DefaultLocalDateTimeReads:

import java.time.LocalDateTime 

val json = Json.parse("""{"date": "2016-05-30T00:23:27.070Z"}""") 
(json \ "date").as[LocalDateTime] 

Falls Sie ein anderes dateTime-Bibliotheksformat benötigen, könnten Sie einen eigenen Leser wie diesen schreiben:

import org.joda.time.DateTime 
import play.api.libs.json.{JsError, _} 


implicit object DateTimeReads extends Reads[DateTime] { 
    val Format = org.joda.time.format.DateTimeFormat 
    .forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") 

    def reads(json: JsValue) = json match { 
    case JsString(x) => JsSuccess(Format.parseDateTime(x)) 
    case _   => JsError(s"Can't read $json as DateTime") 
    } 
} 

(json \ "date").as[DateTime] 
res0: org.joda.time.DateTime = 2016-05-30T00:23:27.070+03:00 
+0

Ich wollte verwenden: https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated – Blankman

+0

@Blankman Warum müssen Sie einzelnes Feld implementieren liest auf diese Weise ? Schau dir 'play.api.libs.json.Reads.DefaultLocalDateTimeReads' an - es ist als benutzerdefinierter Reader implementiert. – ipoteka

+0

java.time.LocalDateTime.parse ("2016-05-30T00: 23: 27.070Z") konnte nicht analysiert werden DateTimeParseException wird ausgelöst. – Blankman

0
import java.time.LocalDateTime 

case class User(createdAt: LocalDateTime) 

implicit val userReads = Json.reads[User]