2014-06-27 12 views
7

Supponiamo ho un censimento o gruppo sigillata del caso oggetti come segue:serializzare e deserializzare enumerazioni Scala o il caso oggetti utilizzando json4s

sealed abstract class Status 
    case object Complete extends Status 
    case object Failed extends Status 
    case object Pending extends Status 
    case object Unknown extends Status 

o

object Status extends Enumeration { 
    val Complete, Failed, Pending, Unknown = Value 
    } 

Qual è il modo più semplice per creare json formati per questi in modo che possa facilmente (a livello di codice) generare formati json da utilizzare in un metodo di fabbrica personalizzato JsonFormat, come il seguente, che funziona per tutte le classi di casi normali, stringhe, raccolte, ecc., ma produce {} o {"name": null} per questi due tipi di enumerazioni ?:

import org.json4s.DefaultFormats 
import org.json4s.jackson.JsonMethods.parse 
import org.json4s.jackson.Serialization 
import org.json4s.jvalue2extractable 
import org.json4s.string2JsonInput 

trait JsonFormat[T] { 
    def read(json: String): T 
    def write(t: T): String 
} 

object JsonFormat { 

    implicit lazy val formats = DefaultFormats 

    def create[T <: AnyRef: Manifest](): JsonFormat[T] = new JsonFormat[T] { 
    def read(json: String): T = parse(json).extract[T] 
    def write(t: T): String = Serialization.write(t) 
    } 
} 

risposta

18

Abbiamo utilizzato org.json4s.ext.EnumNameSerializer per serializzare enumerazioni:

import org.json4s._ 
import org.json4s.ext.EnumNameSerializer 

class DoesSomething { 
    implicit lazy val formats = DefaultFormats + new EnumNameSerializer(Status) 

    ...stuff requiring serialization or deserialization... 
} 

In pratica abbiamo mixin tratto che aggiunge il formato implicita e definisce tutto il nostro personalizzato serializzatore/desrializers:

trait OurFormaters extends Json4sJacksonSupport { 
    implicit lazy val json4sJacksonFormats:Formats = DefaultFormats + 
    UuidSerializer +  
    new EnumNameSerializer(Status) + 
    ... 
} 

object UuidSerializer extends CustomSerializer[UUID](format => 
    (
    { 
     case JString(s) => UUID.fromString(s) 
     case JNull => null 
    }, 
    { 
     case x: UUID => JString(x.toString) 
    } 
) 
) 
Problemi correlati