以下のJSONにアクセスしてみる。
val sample:String = """ { "parts": { "sampleA": "valueA", "sampleB": "valueB", "sampleC": ["valueA", "valueB"] } } """
まずその前に、play.api.libs.jsonにあるJSONライブラリを使用して、JSON文字列をJsValue型に変換する事が出来る。
val jsValue:JsValue = Json.parse(sample)
JsValue型に変換さえしてしまえば、簡単にJSONツリー内にアクセスが可能になる。
・シンプルな \ パス
(jsValue \ "parts" \ "sampleA")
・再帰的な \\ パス
(jsValue \ "parts" \\ "sampleC")
JsValueからScala値への変換は、こうする。
val sample:String = (jsValue \ "parts" \ "sampleA").as[String] val sampleSeq:List[String] = (jsValue \ "parts" \ "sampleC").map(_.as[Seq[String]])
ただし、上記のas[T]を使った方法だと変換出来なかったときにJsResultExceptionが発生するため、asOpt[T]を使用したほうが安全とのこと。
その場合、JsResultExceptionは発生せずにNoneが返るようになる。
val sample:String = (jsValue \ "parts" \ "sampleA").asOpt[String] val sampleSeq:List[String] = (jsValue \ "parts" \ "sampleC").map(_.asOpt[Seq[String]])
ちなみに、再帰的なパスにアクセスしたときの
(jsValue \\ hoge ).map(_.as[T])
のアンダースコアには、配列の要素が毎回入る。(ワイルドカード)
参考URL) http://www.playframework-ja.org/documentation/2.0.8/ScalaJson