2017-01-06 5 views
1

Je suis nouveau à Scala et Akka.Marshalling java.util.Date avec SprayJson

je la classe de cas suivante:

case class Demo(userId: String, date: java.util.Date, message: String) extends  BusinessModel 

Je dois envoyer Liste [Demo] au format JSON comme réponse à une demande get mais je suis face à problème dans le code suivant dû à ce jour:

implicite val demoFormat: RootJsonFormat [Demo] = jsonFormat3 (Demo)

Je vous serais reconnaissant de bien vouloir vous me aider

+0

Si possible, évitez d'utiliser java.util .Date en faveur des nouvelles classes de java.time. * – radumanolescu

Répondre

0

vous devez fournir un formulaire à java.util.Date, puisque le spray n'en a pas par défaut.

Une recherche rapide Google conduit à https://gist.github.com/owainlewis/ba6e6ed3eb64fd5d83e7:

import java.text._ 
import java.util._ 
import scala.util.Try 
import spray.json._ 

object DateMarshalling { 
    implicit object DateFormat extends JsonFormat[Date] { 
    def write(date: Date) = JsString(dateToIsoString(date)) 
    def read(json: JsValue) = json match { 
     case JsString(rawDate) => 
     parseIsoDateString(rawDate) 
      .fold(deserializationError(s"Expected ISO Date format, got $rawDate"))(identity) 
     case error => deserializationError(s"Expected JsString, got $error") 
    } 
    } 

    private val localIsoDateFormatter = new ThreadLocal[SimpleDateFormat] { 
    override def initialValue() = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
    } 

    private def dateToIsoString(date: Date) = 
    localIsoDateFormatter.get().format(date) 

    private def parseIsoDateString(date: String): Option[Date] = 
    Try{ localIsoDateFormatter.get().parse(date) }.toOption 
} 

Importation DateMarshalling._ dans le code de pièce où vous avez écrit implicit val demoFormat: RootJsonFormat[Demo] = jsonFormat3(Demo) et il devrait être ok maintenant :)