在 iOS 中解析 JSON 时遇到一些错误?
Posted
技术标签:
【中文标题】在 iOS 中解析 JSON 时遇到一些错误?【英文标题】:Having some errors parsing JSON in iOS? 【发布时间】:2013-02-10 02:55:45 【问题描述】:这是我的解析代码:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSError *myError = nil;
NSDictionary *flighttrackjson = [NSJSONSerialization JSONObjectWithData:jsonresponse options:NSJSONReadingMutableLeaves error:&myError];
NSArray *FlightStatus = [flighttrackjson objectForKey:@"flightStatuses"];
NSString *FlightID = [FlightStatus valueForKey:@"flightId"];
NSString *DepartACode = [FlightStatus valueForKey:@"departureAirportFsCode"];
NSString *ArivalACode = [FlightStatus valueForKey:@"arrivalAirportFsCode"];
NSArray *DepartATime = [FlightStatus valueForKey:@"departureDate"];
NSArray *AriveATime = [FlightStatus valueForKey:@"arrivalDate"];
NSString *DepartTimeString = [DepartATime valueForKey:@"dateLocal"];
NSString *ArriveTimeString = [AriveATime valueForKey:@"dateUtc"];
NSArray *Delays = [FlightStatus valueForKey:@"delays"];
NSString *DepartDelayMinutes = [Delays valueForKey:@"departureGateDelayMinutes"];
NSString *ArriveDelayMinutes = [Delays valueForKey:@"arrivalGateDelayMinutes"];
NSArray *AirportInfo = [FlightStatus valueForKey:@"airportResources"];
NSString *DepartTerminal = [AirportInfo valueForKey:@"departureTerminal"];
NSString *DepartAGate = [AirportInfo valueForKey:@"departureGate"];
NSString *ArriveTerminal = [AirportInfo valueForKey:@"arrivalTerminal"];
NSString *ArriveAGate = [AirportInfo valueForKey:@"arrivalGate"];
NSString *BaggageClaim = [AirportInfo valueForKey:@"baggage"];
flightID.text=FlightID;
DepartCode.text=DepartACode;
ArrivalCode.text=ArivalACode;
DepartTime.text=DepartTimeString;
ArriveTime.text=ArriveTimeString;
DepartDelay.text=DepartDelayMinutes;
ArriveDelay.text=ArriveDelayMinutes;
DepartTerm.text=DepartTerminal;
DepartGate.text=DepartAGate;
ArriveTerm.text=ArriveTerminal;
ArriveGate.text=ArriveAGate;
Baggage.text=BaggageClaim;
当我运行它时,它给了我这个:
2013-02-09 21:51:40.262 Places[7083:c07] -[__NSArrayI isEqualToString:]:无法识别的选择器发送到实例 0x8262b50 2013-02-09 21:51:40.263 Places[7083:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI isEqualToString:]:无法识别的选择器发送到实例 0x8262b50 '
并强调这一点:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
我的代码看起来很糟糕,或者至少有人可以解释一下这个错误可能意味着什么吗?
这是我正在使用的。 http://pastebin.com/vv8ScBfZ
对不起,我对这一切很陌生。
感谢您的任何提示!
【问题讨论】:
您应该向我们展示您的 JSON 的摘录,以便我们帮助您诊断。但以上没有意义,因为您告诉我们FlightStatus
是NSArray
,但随后您尝试使用valueForKey
从该数组中检索单个NSString
值。如果FlightStatus
是一个字典数组,那么valueForKey
将返回一个值数组,而不是一个单独的NSString
。您的错误消息似乎证实了这一点,因为它告诉您您在某个时候检索了NSArray
,并且您正试图将其用作NSString
。
从错误中猜测,我认为您可能错误地排序了有关 JSON 结构的一些细节。你说它是一本字典,里面的项目是数组……但那准确吗?或者它是一个项目数组,每个项目都像一本字典?
这是我正在使用的,顺便说一句谢谢! pastebin.com/vv8ScBfZ
【参考方案1】:
看起来 FlightStatus 是一个包含一个对象的数组(一个包含一堆键的字典)。由于它是一个数组,因此您必须先获取该对象,然后才能在其包含的字典上使用 valueForKey:。修复它的最简单方法是更改它:
NSArray *FlightStatus = [flighttrackjson objectForKey:@"flightStatuses"];
到这里:
NSDictionary *FlightStatus = [[flighttrackjson objectForKey:@"flightStatuses"] lastObject];
【讨论】:
现在它说:2013-02-10 14:21:33.231 Places[8521:c07] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[__NSCFNumber isEqualToString:] : 无法识别的选择器发送到实例 0x8230650' *** 第一次抛出调用堆栈: @JonSullivan,这可能是因为您分配给字符串的值之一是数字。您必须查看您的 JSON 并查看是哪一个。以上是关于在 iOS 中解析 JSON 时遇到一些错误?的主要内容,如果未能解决你的问题,请参考以下文章
JSON解析在IOS中得到错误NSErrorFailingURLKey