2014-06-27 16 views
7

Giả sử tôi có một điều tra hoặc nhóm kín của trường hợp các đối tượng như sau:Serialize và Deserialize enumerations scala hoặc trường hợp các đối tượng sử dụng 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 

hoặc

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

cách dễ nhất để tạo json là gì các định dạng cho chúng để tôi có thể dễ dàng (lập trình) tạo các định dạng json để sử dụng theo phương thức nhà máy tùy chỉnh JsonFormat, như sau, hoạt động cho tất cả các kiểu chữ thường, chuỗi, bộ sưu tập, v.v., nhưng sản xuất {} hoặc {"name": null} cho hai loại trên của enumerations ?:

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

Trả lời

18

Chúng tôi đã sử dụng org.json4s.ext.EnumNameSerializer serialize enumerations:

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

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

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

Trong thực tế, chúng tôi đã mixin đặc điểm có thêm định dạng ngầm và xác định tất cả các tùy chỉnh của chúng tôi serializer/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) 
    } 
) 
) 
Các vấn đề liên quan