你可以做以下
scala> import play.api.libs.json._
scala> val json: JsValue = Json.parse("""
{
"a": "aaa",
"b": "bbb",
"c":
{
"d": "ddd",
"e": 123456,
"f": "ffff"
}
}
""")
scala> case class abc(a:String, b:String, c:String)
解決方法:1會和工作2.3+
scala> implicit val abcdef: Reads[abc] = new Reads[abc] {
def reads(json:JsValue):JsResult[abc] = {
json match {
case o:JsObject if (o.value.get("a").isDefined && o.value.get("b").isDefined && o.value.get("c").isDefined)=>
o.value.get("a").get match {
case JsString(a)=> o.value.get("b").get match {
case JsString(b)=> o.value.get("c").get match {
case c:JsObject if (c.value.get("d").isDefined && c.value.get("e").isDefined && c.value.get("f").isDefined)=>
c.value.get("d").get match {
case JsString(d)=> c.value.get("e").get match {
case JsNumber(e)=> c.value.get("f").get match {
case JsString(f) => JsSuccess(abc(a,b,d+e+f))
case _ =>JsError("some error")
}
case _ =>JsError("some error")
}
case _ =>JsError("some error")
}
case _ =>JsError("some error")
}
case _ =>JsError("some error")
}
case _ =>JsError("some error")
}
case e => JsError("some error")
}
}
}
scala> json.validate[abc]
解決方案:2將只與2.3.x版本的工作
scala> implicit val abcdef: Reads[abc] = new Reads[abc] {
def reads(json:JsValue):JsResult[abc] = {
json match {
case JsObject(Seq(("a", JsString(a)), ("b", JsString(b)), ("c", jsobj))) => {
jsobj match {
case JsObject(Seq(("d", JsString(d)), ("e", JsNumber(e)), ("f", JsString(f)))) => JsSuccess(abc(a,b,d+e+f))
case _ => JsError("some error")
}
}
case e => JsError("some error" + e)
}
}
}
scala> json.validate[abc]
試圖散發出來,其結果:JSON:play.api.libs.json.JsValue = { 「一」: 「AAA」,「B 「:」 BBB」, 「C」:{ 「d」: 「DDD」, 「E」:123456, 「F」: 「FFFF」}}。不幸的是,這不是我要找的。來自d,e,f的值需要互相附加 – user1584120
請參閱編輯。我正在檢查一個更清潔的方式.. – 757071