将多个json对象转换为scala对象

时间:2013-08-18 17:22:32

标签: json scala playframework-2.0

如何从请求中读取多个json对象并将其转换为我自己的自定义对象。例如,假设我们正在使用以下json检索用户列表:

{
  "users":[
    {
      "name": "Bob",
      "age": 31.0,
      "email": "bob@gmail.com"
    },
    {
      "name": "Kiki",
      "age":  25.0,
      "email": null
    }
  ]
}

我的案例类如下所示

case class User(firstName: String, age: Double, email: String)

在这种情况下,firstName值与“name”json值不同。如何从给定的json文件中获取具有不同名称的Seq [User]。我找不到有人从具有多个对象的json文件中读取的任何示例。

提前致谢。

1 个答案:

答案 0 :(得分:5)

Play的type class-based JSON库为Seq[A]提供了具有相应实例的A的读者和编写者实例,因此您只需为您的用户类型提供一个读者实例,你可以免费获得一组用户的读者。

我们可以从以下案例类开始(请注意,我已经确定电子邮件地址是Option显式可选的):

case class User(firstName: String, age: Double, email: Option[String])

接下来我们定义我们的读者。我正在使用2.1's combinators,但还有其他(更详细)的选项。

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 _)

我们可以测试一下:

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]]

然后:

scala> users foreach println
User(Bob,31.0,Some(bob@gmail.com))
User(Kiki,25.0,None)

正如所料。

相关问题