2011-07-25 15 views
5

varsayalım ben Json serileştirebilir istiyorum aşağıdaki yapıya sahiptir:Bileşik bir nesnenin JSon temsilini "düzleştirmek" nasıl?

case class A(name:String) 

case class B(age:Int) 

case class C(id:String, a:A,b:B) 

Ben asansör-json kullanıyorum "yazma (...)", ama yapıyı düzleştirmek böylece yerine istiyorum:

{ id:xx , a:{ name:"xxxx" }, b:{ age:xxxx } } 

almak istediğim:

{ id:xx , name:"xxxx" , age:xxxx } 

cevap

1

Eğer biraz daha farklı bir yaklaşım isteyecektir:

import net.liftweb.json._ 
import net.liftweb.json.JsonAST._ 
import net.liftweb.json.JsonDSL._ 

implicit val formats = net.liftweb.json.DefaultFormats 
implicit def cToJson(c: C): JValue = (("id" -> c.id):JValue) merge (Extraction decompose c.a) merge (Extraction decompose c.b) 
val c1 = C("c1", A("a name", "a nick", "an alias"), B(11, 111, 1111)) 
Printer pretty (JsonAST render c1) 
res0: String = 
{ 
    "id":"c1", 
    "name":"a name", 
    "nick":"a nick", 
    "alias":"an alias", 
    "age":11, 
    "weight":111, 
    "height":1111 
} 
0

sen alanlar (id, isim, yaş) ile yeni bir nesne D beyan ve ardından seri yapıcı içinde istediğiniz değerleri yükleyebilirsiniz Bu sınıf json'a. Başka bir yol olabilir ama bu şekilde çalışacak.

+0

Eh, bir örnek oldu. A ve B her biri 10 alana sahiptir ve ana sebebi C cinsinden 20 alana sahip olmamaktı, öneri türünü yenilemektir :) – GClaramunt

4

Kullanım JValue üzerine transform yöntemi:

import net.liftweb.json._ 
import net.liftweb.json.JsonAST._ 
implicit val formats = net.liftweb.json.DefaultFormats 
val c1 = C("c1", A("some-name"), B(42)) 
val c1flat = Extraction decompose c1 transform { case JField(x, JObject(List(jf))) if x == "a" || x == "b" => jf } 
val c1str = Printer pretty (JsonAST render c1flat) 

Sonuç: A ve B birden çok alan varsa

c1str: String = 
{ 
    "id":"c1", 
    "name":"some-name", 
    "age":42 
} 
İlgili konular