从 url iOS 解析 json 时应用程序崩溃

Posted

技术标签:

【中文标题】从 url iOS 解析 json 时应用程序崩溃【英文标题】:crashing app when parsing json from url iOS 【发布时间】:2014-12-28 12:30:22 【问题描述】:

我想从 url 解析 JSONNSLog 它。这是我的网址: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。你需要解决这个问题,或者处理它。 异常表明datanil 同步获取 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 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

url 打开时 WebView 加载崩溃

iOS开发过程中,遇到解析的json数据为<null>,进行赋值时会导致崩溃,使用AFNetworking可以这样解决。

JSON解析在IOS中得到错误NSErrorFailingURLKey

从大型 JSON 加载核心数据导致应用程序崩溃

iOS swift 3.0 本地 JSON 解析崩溃

仅当通过 Testflight 安装时应用程序崩溃解析 JSON