use*_*010 2 json scala playframework-2.0
如何从请求中读取多个json对象并将它们转换为我自己的自定义对象.例如,假设我们正在使用以下json检索用户列表:
{
"users":[
{
"name": "Bob",
"age": 31.0,
"email": "bob@gmail.com"
},
{
"name": "Kiki",
"age": 25.0,
"email": null
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的案例类如下所示
case class User(firstName: String, age: Double, email: String)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,firstName值与"name"json值不同.如何从给定的json文件中获取具有不同名称的Seq [User].我找不到有人从具有多个对象的json文件中读取的任何示例.
提前致谢.
Play的基于类的类 JSON库Seq[A]为任何A具有适当实例的人提供了读者和编写器实例,因此您所要做的就是为您的用户类型提供一个读者实例,并且您可以免费获得一组用户的读者.
我们可以从以下案例类开始(请注意,我已将事实上电子邮件地址显式为可选Option):
case class User(firstName: String, age: Double, email: Option[String])
Run Code Online (Sandbox Code Playgroud)
接下来我们定义读者.我正在使用2.1的组合器,但还有其他(更详细)选项.
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val userReads = (
(__ \ 'name).read[String] and
(__ \ 'age).read[Double] and
(__ \ 'email).read[Option[String]]
)(User.apply _)
Run Code Online (Sandbox Code Playgroud)
我们可以测试一下:
val userJson = """{
"users": [
{ "name": "Bob", "age": 31.0, "email": "bob@gmail.com" },
{ "name": "Kiki", "age": 25.0, "email": null }
]
}"""
val users = (Json.parse(userJson) \ "users").as[Seq[User]]
Run Code Online (Sandbox Code Playgroud)
然后:
scala> users foreach println
User(Bob,31.0,Some(bob@gmail.com))
User(Kiki,25.0,None)
Run Code Online (Sandbox Code Playgroud)
正如所料.