2013-08-18 45 views
2

如何从请求中读取多个json对象并将它们转换为我自己的自定义对象。例如,让我们说,我们要检索的用户列表具有以下JSON:将多个json对象转换为scala对象

{ 
    "users":[ 
    { 
     "name": "Bob", 
     "age": 31.0, 
     "email": "[email protected]" 
    }, 
    { 
     "name": "Kiki", 
     "age": 25.0, 
     "email": null 
    } 
    ] 
} 

和我的情况类看起来像下面

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

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

在此先感谢。

回答

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": "[email protected]" }, 
    { "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([email protected])) 
User(Kiki,25.0,None) 

正如预期的那样。