简体   繁体   中英

Write nullable with Json transformers in play framework 2

I can't understand, can i do this with Json transformer?

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)

The source code analysis resulted in a decision

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

or more familiar (from Json combinators)

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

result:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM