我的iOS应用程序正在从服务器获取JSON响应
.//*[@id='subjectId']/div[1]/label
有时服务器已关闭或JSON中可能存在错误,因此不存在此类值(message,someInt),我希望在没有应用程序崩溃的情况下处理它 - 我该怎么办?
答案 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()
如果遇到任何错误,您将在控制台中收到一条消息,从而阻止应用程序崩溃