我已经阅读了几种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,则处理该情况。到目前为止这是一种正确的方法吗?或者有更简单的方法吗?