2014-04-10 18 views
13

Tôi đang viết Trình xử lý khách hàng. Trong đó Serializer tôi muốn bằng cách nào đó nói: "và điều này bạn đã biết làm thế nào để serialize".Làm thế nào để tuần tự hóa đối tượng với AST bằng cách sử dụng json4s?

cách tiếp cận hiện tại của tôi trông như thế:

import org.json4s.native.Serialization._ 
    import org.json4s.JsonDSL.WithBigDecimal._ 

    object WindowSerializer extends CustomSerializer[Window](format => 
     ([omitted], 
     { 
      case Window(frame, size) => 

      ("size" -> size) ~ 
      ("frame" -> parse(write(frame))) 
     })) 

Đó parse(write(frame)) điều là cả hai xấu xí và không hiệu quả. Cách khắc phục điều đó?

Trả lời

23

Bạn có thể gọi Extraction.decompose(a: Any)(implicit formats: Formats): JValue tạo ra JValue từ một số giá trị sử dụng phản ánh thời gian chạy.

import org.json4s._ 
import org.json4s.jackson.JsonMethods._ 
import org.json4s.JsonDSL._ 
import java.util.UUID 

case class Thing(name: String) 
case class Box(id: String, thing: Thing) 

class BoxSerializer extends CustomSerializer[Box](format => ({ 
    case jv: JValue => 
    val id = (jv \ "id").extract[String] 
    val thing = (jv \ "thing").extract[Thing] 
    Box(id, thing) 
}, { 
    case b: Box => 
    ("token" -> UUID.randomUUID().toString()) ~ 
     ("id" -> box.id) ~ 
     ("thing" -> Extraction.decompose(box.thing)) 
})) 

implicit val formats = DefaultFormats + new BoxSerializer 

val box = Box("1000", Thing("a thing")) 

// decompose the value to JSON 
val json = Extraction.decompose(box) 
println(pretty(json)) 
// { 
// "token" : "d9bd49dc-11b4-4380-ab10-f6df005a384c", 
// "id" : "1000", 
// "thing" : { 
//  "name" : "a thing" 
// } 
// } 

// and read a value of type Box back from the JSON 
println(json.extract[Box]) 
// Box(1000,Thing(a thing)) 
+0

Có vẻ ổn! Tôi sẽ thử vào ngày mai. – mjaskowski

+0

Tuyệt vời hoạt động! Tôi sẽ chấp nhận câu trả lời này nếu bạn chỉ bao gồm ví dụ của tôi được sửa đổi để sử dụng 'Extraction.decompose'. – mjaskowski

+0

Bạn có thể thêm lớp Cửa sổ vào câu hỏi của mình không? –

Các vấn đề liên quan