Play 框架:如何将 JSON 转换为 List[Int]

j3d*_*j3d 2 json scala playframework

给定以下 JSON 字符串...

val jsonStr = "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)

...我如何将其转换为 a List[Int]?以下语句返回 a JsValue,其中不包含 method read

Json.parse(jsonStr)
Run Code Online (Sandbox Code Playgroud)

Tra*_*own 5

Play 提供了几种解码 JSON 的方法。“最简单”是as

scala> import play.api.libs.json._
import play.api.libs.json._

scala> val jsonStr = "[1, 2, 3]"
jsonStr: String = [1, 2, 3]

scala> val json = Json.parse(jsonStr)
json: play.api.libs.json.JsValue = [1,2,3]

scala> val xs = json.as[List[Int]]
xs: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

但是,如果您实际上没有整数列表,这将引发异常,因此这通常是一个坏主意。asOpt并且validate要好得多:

scala> val xsMaybe = json.asOpt[List[Int]]
xsMaybe: Option[List[Int]] = Some(List(1, 2, 3))

scala> val xsResult = json.validate[List[Int]]
xsResult: play.api.libs.json.JsResult[List[Int]] = JsSuccess(List(1, 2, 3),)
Run Code Online (Sandbox Code Playgroud)

现在你被类型系统强迫去处理错误的可能性,这意味着在运行时更少的意外。

所有这些方法都采用隐式Reads[_]参数。Play提供了实例Reads[Int]Reads[List[A: Reads]]开箱即用,你可以定义自己获得自己的类型相同的语法Reads的实例。