Comment formater un enum en json avec Play

Publié le 10 Octobre 2016

Play ne supporte pas nativement la serialisation d'enum vers json. (Je pense qu'il s'agit d'une sombre histoire de compatibilité avec la version Java de Play).

Qu'à cela ne tienne on peut facilement écrire un json format qui fonctionne pour n'importe quelle Enumeration en quelques lignes:

import play.api.libs._

object EnumFormat {
   def formatEnum[E <: Enumeration](enum: E): Format[E#Value] = {
      // méthode pour gérer les erreurs en cas de valeur d'enum inconnue
      def readError(json: JsValue) =
         ValidationError("Can't parse {}, expected one of {}",
             json,
             enum.values.map(_.toString).mkString(", ")
        )

      new Format[E#Value] = {
         override def reads(json: JsValue): JsResult[E#Value] =
            json.validate[String]
              .map(s => Try(enum.withName(s)).toOption)
              .collect(readError(json)) { case Some(e) => e }

         override def writes(e: E#Value): JsValue =
           JsString(e.toString)
   }
}

 

Ensuite il n'y a plus qu'à utiliser EnumFormat.format pour définir un format json pour n'importe quelle enum:

object MyEnum extends Enumeration {
  // Enum avec Oui et Non comme valeur
   val Oui, Non = Value
  implicit val format = EnumFormat.format(MyEnum)
}

Rédigé par Bliz

Publié dans #Scala

Repost 0
Commenter cet article