2014-06-27 12 views
7

Angenommen, ich habe eine Aufzählung oder versiegelt Gruppe von Fallobjekte wie folgt:Serialize und Deserialize scala Aufzählungen oder Fallobjekte json4s mit

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

oder

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

Was ist der einfachste Weg json zu erstellen Formate für diese, so dass ich sehr einfach (programmatisch) JSON-Formate für die Verwendung in einer benutzerdefinierten Factory-Methode JsonFormat, wie folgt generieren kann, die für alle normalen Fall Klassen, Strings, Sammlungen usw. funktioniert, aber produziert {} oder {"name": null} für die oben genannten zwei Arten von Aufzählungen ?:

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) 
    } 
} 

Antwort

18

Wir org.json4s.ext.EnumNameSerializer verwendet haben Aufzählungen serialisiert:

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

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

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

In der Praxis wir Charakterzug mixin haben, dass die implizite Format ergänzt und alle unsere kundenspezifischen definiert Serialisierer/Desrializer:

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) 
    } 
) 
) 
Verwandte Themen