使用SwiftyJSON解析JSON响应而不会崩溃

时间:2016-07-07 10:26:42

标签: ios json swift swifty-json

我的iOS应用程序正在从服务器获取JSON响应

.//*[@id='subjectId']/div[1]/label

有时服务器已关闭或JSON中可能存在错误,因此不存在此类值(message,someInt),我希望在没有应用程序崩溃的情况下处理它 - 我该怎么办?

4 个答案:

答案 0 :(得分:3)

使用SwiftyJSON时,非可选的getter以Value结尾,而可选的getter则不会。

因此,要测试值是否在此处,您可以使用if let的可选绑定:

if let someInt = json["someInt"].int,
    message = json["message"].string {
        // someInt and message are available here
} else {
    // someInt and message are not available
}

guard

guard let someInt = json["someInt"].int,
    message = json["message"].string else {
        // error, someInt and message are not available
        return
}
// someInt and message are available here

答案 1 :(得分:2)

很简单,可能你已经知道了,你可以用以下方法保护你的代码:

if  let someInt = json["someInt"].int {
    // do whatever you want with someInt
}
if let message = json["message"].string {
    // do whatever you want with message
}

尝试这种方法:

request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
                data, response, error in
                if let data = data,
                   jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)
                    where error == nil {
                        var json = JSON(data: data!)
                        // use some protection as explained before..
                } else {
                    print("error=\(error!.localizedDescription)")
                }
            }
task.resume()

答案 2 :(得分:1)

让我发布我的答案=)

首先,您可以为失败的JSON初始化程序实现小扩展:

#include <iostream>
#include <bitset>
#include <vector>
#include <iterator>
#include <algorithm>

#define SIZE 3

int main() {

    size_t size=SIZE;
    std::vector<size_t> v(SIZE); v={3,0,7};
    std::bitset<SIZE> b("110");

    for (size_t i=0; i<size; ++i)
    {
        if (b[size-1-i]) // reverse
        {
            ++v[i];
        }
    }

    std::copy ( v.begin()
              , v.end()
              , std::ostream_iterator<size_t>(std::cout, ",") );

    //    3+1,0+1,7+0
    // => 4,1,7

    return 0;
}

您可以在导入extension JSON { init?(_ data: NSData?) { if let data = data { self.init(data: data) } else { return nil } } } 的情况下将其置于全局范围内,但在SwiftyJSON中使用之前忘记强制解包数据。如果您使用它们,可以为其他数据类型编写相同的失败初始值设定项。它仅用于将来更短和可读的代码。对于许多路由或在某些情况下,例如当您从json等待一些单个字段时,此扩展可以使您的代码看起来非常简单和可读:

JSON

然后你需要检查你需要的nil(事实上在前面的答案中解释)。您可能正在搜索完全有效的数据,因此请使用if-let chain:

guard let singleMessage = JSON(data: data)?["message"].string else {return}

答案 3 :(得分:0)

最好的办法是使用try catch

request.HTTPBody = postdata.dataUsingEncoding(NSUTF8StringEncoding)
    let task  = NSURLSession.sharedSession().dataTaskWithRequest(request)
    {
        (data, response, error) in
        dispatch_async(dispatch_get_main_queue(), {
        var jsondata: AnyObject?
        do
        {
            let jsondata = try NSJSONSerialization.JSONObjectWithData(data!, options: [])
            print(jsondata)
            // your code here
        }
        catch
        {
                print("Some Error Found")
        }
    })

    }

    task.resume()

如果遇到任何错误,您将在控制台中收到一条消息,从而阻止应用程序崩溃