如何使用JSONJoy解析可选的JSON对象?

时间:2016-09-25 09:34:13

标签: ios json swift parsing

https://github.com/daltoniam/JSONJoy-Swift 例如:

JSON1 = {
"message": "Sorry! Password does not match.",
"code": "4"
}

JOSN2 = {
"data": {
"id": 21
},
"message": "Signup Successful.",
"code": "1"
},

这里json键“data”是可选的。那么我如何使用相同的模型对象来处理两个响应?

1 个答案:

答案 0 :(得分:0)

JSONJoy原生地将未找到的元素设置为nil,你只需要声明它们是可选的,然后在使用之前检查nil。

来自文档

  

这也像大多数Swift JSON库一样具有自动可选验证。

     

//一些随机错误的密钥。这将工作正常和财产   只会是零。

     

firstName = decoder [5] [" wrongKey"] [" MoreWrong"]。string

     

// firstName是nil,但没有崩溃!

这是我的例子,我的说明。我有一个复杂的对象集,其中我的顶级对象(UserPrefs)具有辅助对象数组(SmartNetworkNotification和SmartNotificationTime)。

请注意,通知和时间都声明为可选。我做的是在尝试解析辅助对象数组后检查nil。没有nil检查,迭代解析列表的尝试失败,因为它为零。如果没有检查,只要它是空的,它就会移过它。

这对我有用,但尚未经过深度测试。因人而异!好奇其他人如何处理它。

struct UserPrefs: JSONJoy {
    var notifications: [SmartNetworkNotification]?
    var times: [SmartNotificationTime]?

    init(_ decoder: JSONDecoder) throws {
        // Extract notifications
        let notificationsJson = try decoder["notifications"].array
        if(notificationsJson != nil){
            var collectNotifications = [SmartNetworkNotification]()
            for notificationDecoder in notificationsJson! {
                do {
                    try collectNotifications.append(SmartNetworkNotification(notificationDecoder))
                } catch let error {
                    print("Error.. on notifications decoder")
                    print(error)
                }
            }
            notifications = collectNotifications
        }

        // Extract time of day settings

        let timesJson = try decoder["times"].array
        if(timesJson != nil){
            var collectTimes = [SmartNotificationTime]()
            for timesDecoder in timesJson! {
                do {
                    try collectTimes.append(SmartNotificationTime(timesDecoder))
                } catch let error {
                    print("Error.. on timesJson decoder")
                    print(error)
                }
            }
            times = collectTimes
        }
    }