2014-06-27 21 views
7

varsayalım ben şöyle bir numaralandırma veya davanın mühürlü grup nesneleri vardır:serialize ve skala enumerations veya dava Deserialize json4s kullanarak nesneleri

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

veya json oluşturmanın en kolay yolu nedir

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

Bunlar için formatları çok kolay (programlı olarak), tüm normal durum sınıfları, dizeler, koleksiyonlar vb. için çalışan, ancak {} veya JsonFormat fabrika yönteminde kullanılmak üzere json formatları oluşturabilmem için örtük biçimde ekler ve Tüm özel tanımlar biz özellik mixin var Uygulamada

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

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

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

: Biz numaralandırma seri hale getirmek için org.json4s.ext.EnumNameSerializer kullandım

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

cevap

18

numaralandırma yukarıdaki iki tip {"name": null} ?: diziselleştirici/desemizatörleri:

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