2015-11-06 34 views
0

我想結合使用播放2.3從json結構到另一個json結構的幾個字段。基本上我想要做的是藉此:json到json轉換使用播放2.3,結合字段

{ 
    "a": "aaa" 
    "b": "bbb" 
    "c": 
    { 
     "d": "ddd" 
     "e": 123456 
     "f": "ffff" 
    } 
} 

,並把它變成這樣:

{ 
    "a": "aaa" 
    "b": "bbb" 
    "new": "ddd123456fff 
} 

我看了一下這裏的解決方案:https://groups.google.com/forum/#!msg/play-framework/6MdDYf1JjEg/z_WG3DcdQIQJ 但「和」 ISN」 t可用,我不認爲'和那麼'是一回事。

回答

0

你可以做以下

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] 
+0

試圖散發出來,其結果:JSON:play.api.libs.json.JsValue = { 「一」: 「AAA」,「B 「:」 BBB」, 「C」:{ 「d」: 「DDD」, 「E」:123456, 「F」: 「FFFF」}}。不幸的是,這不是我要找的。來自d,e,f的值需要互相附加 – user1584120

+0

請參閱編輯。我正在檢查一個更清潔的方式.. – 757071

0

最常用的交流方式hieve這是結合讀作解釋這裏:
https://www.playframework.com/documentation/2.3.x/ScalaJsonCombinators

import play.api.libs.json._, Reads.at 
import play.api.libs.functional.syntax._ 

val js = Json.parse("""{ 
    "a": "aaa", 
    "b": "bbb", 
    "c": { 
     "d": "ddd", 
     "e": 123456, 
     "f": "ffff" 
    } 
}""") 

val transform = { 

    val c = (__ \ "c"); 
    { 
    c.json.prune ~ 
    (__ \ "new").json.copyFrom(
     at[String](c \ "d") ~ 
     at[Int] (c \ "e") ~ 
     at[String](c \ "f") apply (_ + _ + _) map (JsString) 
    ) 
    }.apply(_ ++ _).reads(_) 
} 

transform(js)