2016-02-01 63 views
0

我無法理解,可以使用Json變壓器執行此操作嗎?在框架2中使用Json變形金剛編寫空值

import play.api.libs.json._ 

val r = (__ \ "opt").readNullable[String] 
val w = (__ \ "someOpt").writeNullable[String] 

val o1 = Json.obj("noopt" -> "some opt value") 
val o2 = Json.obj("opt" -> "some opt value") 

r.reads(o1).map(w.writes) 
r.reads(o2).map(w.writes) 

...

scala> res6: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({},) 

scala> res7: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"someOpt":"some opt value"},/opt) 

回答

0

的源代碼分析,得出

val t = Reads.nullable[String](__ \ "opt").map{ 
    case Some(o) => JsPath.createObj((__ \ "someOpt") -> JsString(o)) 
    case _ => Json.obj() 
} 

或更熟悉的(從Json的組合程序)的決定

val t = (__ \ "opt").readNullable[String].map{ 
    case Some(o) => Json.obj("someOpt" -> o) 
    case _ => Json.obj() 
} 

結果:

val o1 = Json.obj("noopt" -> "some opt value") 
val o2 = Json.obj("opt" -> "some opt value") 

o1.transform(t) 
o2.transform(t) 

scala> res23: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({},) 

scala> res24: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"someOpt":"some opt value"},/opt)