§Play JSON ライブラリ
§概要
JSON を使いたければ、play.api.libs.json
にある JSON ライブラリを基にした Play の型クラスを使うことをおすすめします。
このライブラリは、超高速の Java ベースの JSON ライブラリ、Jerkson の Scala ラッパー Jackson の上に構築されています。
このアプローチの利点は、Scala と Java の両方で Play は同じ基礎となるライブラリ (Jackson) を共有することができます。Scala ユーザーは Play の JSON サポートがテーブルにもたらす特上の型安全性を楽しむことができます。
play.api.libs.json
パッケージは 7 つの JSON データ型を含みます。
JsObject
JsNull
JsUndefined
JsBoolean
JsNumber
JsArray
JsString
これらは全て一般的な JSON の値である JsValue
から継承されます。
§Json 文字列のパース
どのような JSON 文字列でも簡単に JsValue
としてパースすることができます:
val json: JsValue = Json.parse(jsonString)
§Json ツリーの探索
JsValue
を取得し次第、このツリーを探索することができます。この API は Scala で NodeSeq
を使って XML ドキュメントを探索するために提供されているものと似ています:
val json = Json.parse(jsonString)
val maybeName = (json \ "user" \ name).asOpt[String]
val emails = (json \ "user" \\ "emails").map(_.as[String])
注意 \ と \\ を使った探索が失敗することはありません。処理の最後で、値が見つからなかった場合に
None
を返すasOpt[T]
を使って、エラーが発生した場合の処理をしなければいけません。または、値が見つからなかった場合に例外と共に失敗するas[T]
を使うことができます。
§Scala から Json への変換
Scala 型を Json に変換することのできる型クラスがあれば、とても簡単に Scala の値から Json を生成することができます。例として、シンプルな Json オブジェクトを作成してみましょう:
val jsonNumber = Json.toJson(4)
または、json 配列を作ってみましょう:
val jsonArray = Json.toJson(Seq(1, 2, 3, 4))
ここでは何の問題もなく Seq[Int]
を Json 配列に変換しています。しかし、Seq
が異なる種類の値を含む場合、もっと複雑になります:
val jsonArray = Json.toJson(Seq(1, "Bob", 3, 4))
これは、Seq[Any]
を Json に変換する方法がないためです。(Any
は Json がサポートしていないものを含むことだってありますよね?)
シンプルに解決するには、これを Seq[JsValue]
として扱います:
val jsonArray = Json.toJson(Seq(
toJson(1), toJson("Bob"), toJson(3), toJson(4)
))
もっと複雑な Json オブジェクトを作成する最後の例を見てみましょう:
val jsonObject = Json.toJson(
Map(
"users" -> Seq(
toJson(
Map(
"name" -> toJson("Bob"),
"age" -> toJson(31),
"email" -> toJson("[email protected]")
)
),
toJson(
Map(
"name" -> toJson("Kiki"),
"age" -> toJson(25),
"email" -> JsNull
)
)
)
)
)
これは以下の Json を生成します:
{
"users":[
{
"name": "Bob",
"age": 31.0,
"email": "[email protected]"
},
{
"name": "Kiki",
"age": 25.0,
"email": null
}
]
}
§Json シリアライズ
JsValue
を、それ自身を表現する Json 文字列にシリアライズするのは簡単です:
val jsonString: String = Json.stringify(jsValue)
§その他のオプション
上記の型クラスに基づいた解決策がお勧めではありますが、もし必要であれば、ユーザがこの他のどのような JSON ライブラリを使うことも止めはしません。
例えば以下は、バンドルされたリフレクションベースの Jerkson ライブラリを使って、素の scala オブジェクトを JSON にマーシャリングして回線越しに送信する小さなスニペットです。
import com.codahale.jerkson.Json._
val json = generate(
Map(
"url"-> "http://nytimes.com",
"attributes" -> Map(
"name" -> "nytimes",
"country" -> "US",
"id" -> 25
),
"links" -> List(
"http://link1",
"http://link2"
)
)
)
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。