将深度嵌套的JSON解析为Scala选项[Object]

将深度嵌套的JSON解析为Scala选项[Object],json,scala,parsing,playframework,Json,Scala,Parsing,Playframework,我已经阅读了几种JSON解析技术,但我不能确切地理解如何获得我想要的功能。我试图解析一个深度嵌套的JSON,它是从Facebook Graph API(用户消息)返回的。我试图解析的JSON的格式如下: { "data":[ { "id":"", "to":{ "data":[ { "id":"", "name":"" }, {

我已经阅读了几种JSON解析技术,但我不能确切地理解如何获得我想要的功能。我试图解析一个深度嵌套的JSON,它是从Facebook Graph API(用户消息)返回的。我试图解析的JSON的格式如下:

{
"data":[
  {
     "id":"",
     "to":{
        "data":[
           {
              "id":"",
              "name":""
           },
           {
              "id":"",
              "name":""
           }
        ]
     },
     "updated_time":"2014-07-04T22:43:41+0000",
     "unread":0,
     "unseen":0,
     "comments":{
        "data":[
           {
              "id":"",
              "from":{
                 "id":"",
                 "name":""
              },
              "message":"",
              "created_time":""
           },
           {
              "id":"",
              "from":{
                 "id":"",
                 "name":""
              },
              "message":"",
              "created_time":""
           }
        ],
        "paging":{
           "previous":""
        }
     }
  }
],
"paging":{
  "previous":"",
  "next":""
},
"summary":{
  "unseen_count":0,
  "unread_count":0,
  "updated_time":"2014-07-04T22:13:37+0000"
 }
}
如您所见,它嵌套得非常深。我一直在尝试用Play JSON(JSON宏初始版本)解析这一点。我已经为每个层创建了案例类

case class User(id: String)
case class To(data: Seq[User])
case class Message(message: Option[String], from: User, created_time: String)
case class Comment(data: Array[Message], paging: Paging)
case class Chat(id: String, to: To, updated_time: String, comments: Option[Comment])
case class Paging(previous: String, next: String)
case class Summary(updated_time: String)
case class FBInbox(data: Array[Chat], paging: Paging, summary: Summary)
这似乎很有效。但是,我希望每个层为每个类的每个成员返回一个选项[]。这样,如果缺少什么,就不会有问题。我的问题是,如果我使用
JSON.asOpt[FBInbox]
将JSON解析为头级别,那么会将每个元素的“选项”向下传播到每个级别吗?如果没有,我是否可以使用另一个具有此功能的JSON解析器(Argonaut、Lift、Jackson)


总之,我希望能够解析整个JSON,并为每个类中的每个成员提供一个选项。然后,如果解析后的JSON存在,我可以从中检索数据,如果不存在,我可以处理它。到目前为止,这是正确的方法吗?还是有更简单的方法

为什么不能在case类中简单地声明每个成员为可选的呢?不,我可以这么做。但是,通过这样做,它将提供类似于Json.asOpt()的功能,返回一个元素(如果存在),如果不存在,则返回无?换句话说,如果我将成员的类型声明为可选的,它会将它们解析为可选的,还是仅仅将对象包装在一个选项中?不,我认为这与我的想法完全不同。一个说整个对象可能不存在,另一个说它必然存在,但它的任何属性都可能不存在。