从 url iOS 解析 json 时应用程序崩溃
Posted
技术标签:
【中文标题】从 url iOS 解析 json 时应用程序崩溃【英文标题】:crashing app when parsing json from url iOS 【发布时间】:2014-12-28 12:30:22 【问题描述】:我想从 url 解析 JSON
和 NSLog
它。这是我的网址:http://api.kivaws.org/v1/loans/search.json?status=fundraising
这是我的代码。当我运行我的代码时会崩溃.....
NSURL * url=[NSURL URLWithString:@"http://api.kivaws.org/v1/loans/search.json?status=fundraising"];
NSData* data = [NSData dataWithContentsOfURL:url];
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data options:kNilOptions
error:&error];
NSLog(@"%@",json);
请帮帮我....这是我的崩溃错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
*** First throw call stack:
(
0 CoreFoundation 0x0000000104827f35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000106905bb7 objc_exception_throw + 45
2 CoreFoundation 0x0000000104827e6d +[NSException raise:format:] + 205
3 Foundation 0x00000001065aa1bf +[NSJSONSerialization JSONObjectWithData:options:error:] + 67
4 json 0x00000001046608b9 -[ViewController viewDidLoad] + 185
5 UIKit 0x00000001052d3a90 -[UIViewController loadViewIfRequired] + 738
6 UIKit 0x00000001052d3c8e -[UIViewController view] + 27
7 UIKit 0x00000001051f2ca9 -[UIWindow addRootViewControllerViewIfPossible] + 58
8 UIKit 0x00000001051f3041 -[UIWindow _setHidden:forced:] + 247
9 UIKit 0x0000000112eac7b0 -[UIWindowAccessibility _orderFrontWithoutMakingKey] + 68
10 UIKit 0x00000001051ff72c -[UIWindow makeKeyAndVisible] + 42
11 UIKit 0x00000001051aa061 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2628
12 UIKit 0x00000001051acd2c -[UIApplication _runWithMainScene:transitionContext:completion:] + 1350
13 UIKit 0x00000001051abbf2 -[UIApplication workspaceDidEndTransaction:] + 179
14 FrontBoardServices 0x000000010b6692a3 __31-[FBSSerialQueue performAsync:]_block_invoke + 16
15 CoreFoundation 0x000000010475d53c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
16 CoreFoundation 0x0000000104753285 __CFRunLoopDoBlocks + 341
17 CoreFoundation 0x0000000104753045 __CFRunLoopRun + 2389
18 CoreFoundation 0x0000000104752486 CFRunLoopRunSpecific + 470
19 UIKit 0x00000001051ab669 -[UIApplication _run] + 413
20 UIKit 0x00000001051ae420 UIApplicationMain + 1282
21 json 0x0000000104660ca3 main + 115
22 libdyld.dylib 0x0000000107089145 start + 1
23 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
【问题讨论】:
您的data
参数是nil
。你需要解决这个问题,或者处理它。
异常表明data
是nil
。
同步获取 URL 是个坏主意。
有比dataWithContentsOfURL
更好的获取数据的方法,比如sendAsynchronousRequest
。
@mamal10 使用NSJSONSerialization
解析响应没有错。但是您使用NSData dataWithContentsOfURL
来获取数据,这 很糟糕,因为如果失败,它不会告诉您失败的原因。如果您使用了其中一种异步技术(搜索“NSURLConnection sendAsynchronousRequest 示例”或“NSURLSession dataTaskWithURL 示例”,您可能会看到很好的示例),它们 (a) 提供信息丰富的 NSError
对象,您可以检查请求是否失败; (b) 是异步的,解决了代码中一个严重但完全不相关的问题。
【参考方案1】:
如果您需要知道失败的原因,请从
开始NSError* error = nil;
NSData* data = [NSData dataWithContentsOfURL:url options: nil error:&error]:
那么如果这失败了,你可以通过使用查看错误
NSLog@"Error description = %@", [error localizedDescription];
另外,正如其他人所说,您应该更改代码,以便异步获取 URL。相反,对于非文件 URL,请考虑使用 NSSession 类的 dataTaskWithURL:completionHandler: 方法。详情请见URL Loading System Programming Guide。
【讨论】:
检查错误参数不正确,不保证成功时为nil。相反,必须检查返回值,在本例中为数据,是否为零。 @Zaph ???我没有说它是。我写的是“如果你需要知道失败的原因”。官方文档使用几乎完全相同的措辞:“如果您需要知道失败的原因是什么,请使用 dataWithContentsOfFile:options:error:”所以我认为我几乎不应该投反对票。 @zaph 谁说这是检查失败???我很清楚地说“如果你需要知道失败的原因”。提问者知道他的数据为零(他在 cmets 中这么说(用蹩脚的英语)),他的问题是“为什么”?所以我为此给了他一些帮助。 好吧,如果有人对我回答的意图感到困惑(这是向他展示如何找到已知失败的原因,正如他所问的那样),那么我猜得更多会,所以我会改变它。你现在觉得怎么样? 嗯,我在想,否则你会记录一些没有错误的东西,而不是记录不存在的错误的描述。但是,是的,这并不重要,而且在您上次发表评论之前我已经删除了。您是否同意我的回答(至少现在)是提问者可以继续寻找其意外 nil 数据值的原因的一种方式?以上是关于从 url iOS 解析 json 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发过程中,遇到解析的json数据为<null>,进行赋值时会导致崩溃,使用AFNetworking可以这样解决。