技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Play2.4 でネストしたJsonをバインドする

何で今更かというと、これつかえねーかなと思ったから。

最初は、Forms でのバインドをしようとしたのだけど、早速フォーラムが見つかりました。
キーワードは Play recursive form

https://groups.google.com/forum/#!topic/play-framework/Ya1hPmR2QtY

この中で、「Form はそもそもHttpRequestを前提にしてんだからそんな事すんじゃねぇ」と言われていて、「Play Json 使え」とも誰か言ってた。
そこで、キーワード変更で、「Play recursive json」でググったところ、

ScalaJsonCombinators

を発見。

2.4 になってかなり使いやすくなってきてたので、これでざっくり実装してみた。

import play.api.libs.json._ // JSON library
import play.api.libs.json.Reads._ // Custom validation helpers
import play.api.libs.functional.syntax._ // Combinator syntax


case class Nested(name: String, content:String, friends: Seq[Nested])

implicit lazy val userReads: Reads[Nested] = (
  (__ \ "name").read[String] and
  (__ \ "content").read[String] and
  (__ \ "friends").lazyRead(Reads.seq[Nested](userReads))
)(Nested)

val json = Json.parse("""{"name":"Example", "content":"content", "friends":[{"name":"ChildName", "content":"childContent", "friends":[]}]}""")
val result = json.validate[Nested].asOpt
println(result)

して結果が

Some(Nested(Example,content,List(Nested(ChildName,childContent,List()))))

わーい。
Json で設定ファイルとかできるでw