将深层嵌套的JSON解析为Scala Option [Object]

时间:2014-07-20 18:55:54

标签: json scala parsing playframework

我已经阅读了几种JSON解析技术,但我无法完全理解如何获得我想要的功能。我正在尝试解析从Facebook Graph API(用户消息)返回的深层嵌套JSON。我试图解析的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 Macro Inception)来解析它。我为每个图层创建了案例类。

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)

这似乎运作良好。但是,我希望每个图层为每个类的每个成员返回一个Option []。这样,如果遗漏任何东西,就不会有问题。我的问题是,如果我使用Json.asOpt[FBInbox]将JSON解析为头部级别,那么会传播'选项'对于每个级别的每个元素?如果没有,是否有一个我可以使用的具有此功能的不同JSON解析器(Argonaut,Lift,Jackson)?

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

0 个答案:

没有答案