2014-04-10 17 views
13

Müşteri Serileştiricisi yazıyorum. Bu seri hale getiricide bir şekilde şunu söylemek isterim: "ve bu şeyi nasıl serpiştireceğinizi zaten biliyorsunuz".Json4s kullanarak AST'ye nesne nasıl serileştirilir?

Benim mevcut yaklaşımın benziyor:

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)) Bu işler çirkin ve verimsiz hem de. Bunu nasıl düzeltebilirim?

cevap

23

Extraction.decompose(a: Any)(implicit formats: Formats): JValue numaralı telefonu arayarak, çalışma zamanı yansımasını kullanarak bir değerden JValue üretir.

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

Güzel görünüyor! Yarın deneyeceğim. – mjaskowski

+0

Harika, işe yarıyor! Sadece benim örnek değiştirilmiş içerirseniz, 'Extraction.decompose' kullanıldığında bu cevabı kabul ediyorum. – mjaskowski

+0

Window sınıfınızı sorunuza ekler misiniz? –

İlgili konular