如何“展平”复合对象的JSON表示?

5
假设我有以下结构需要序列化为Json:
case class A(name:String)

case class B(age:Int)

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

我可以帮助您进行翻译。以下是需要翻译的内容:

我正在使用lift-json中的“write(...)”,但我想要扁平化结构,而不是:

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

我希望获得:

{ id:xx , name:"xxxx" , age:xxxx  }
3个回答

4

使用JValuetransform方法:

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)

结果:

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

1
如果A和B有多个字段,您将需要稍微不同的方法:
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
你可以声明一个新的对象D,带有字段(id、name、age),并在构造函数中加载所需的值,然后将该类序列化为json。可能还有其他方法,但这种方法可行。

好的,这只是一个例子。A和B各有10个字段,而拥有它们的主要原因并不是为了在C中拥有20个字段,你的建议有点违背初衷 :) - GClaramunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接