【问题标题】:converting multiple json objects into scala objects将多个 json 对象转换为 scala 对象
【发布时间】:2026-01-05 21:45:01
【问题描述】:

如何从请求中读取多个 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 文件中读取的任何示例。

提前致谢。

【问题讨论】:

    标签: json scala playframework-2.0


    【解决方案1】:

    Play 的 type class-based JSON 库为任何 A 提供了 Seq[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)
    

    正如预期的那样。

    【讨论】:

      最近更新 更多