JSON 和 iOS 7 错误
Posted
技术标签:
【中文标题】JSON 和 iOS 7 错误【英文标题】:JSON and iOS 7 error 【发布时间】:2014-02-04 17:25:26 【问题描述】:我有一个如下所示的 JSON 响应:
"load_count":171,"play_count":142,"play_rate":0.9292035398230089,"hours_watched":2.795013611111111,"engagement":0.708595,"visitors":113
当我尝试将变量设置为此处的值时:
- (id)initWithJSONDictionary:(NSDictionary *)jsonDictionary
if(self = [self init])
// Assign all properties with keyed values from the dictionary
_plays = [jsonDictionary objectForKey:@"load_count"];
_hoursWatched = [jsonDictionary objectForKey:@"hours_watched"];
_engagement = [jsonDictionary objectForKey:@"engagement"];
return self;
我收到此错误:
2014-02-04 11:16:37.180 BluGiant2[21192:1303] -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x10a1176d0
2014-02-04 11:16:37.181 BluGiant2[21192:1303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x10a1176d0'
所以它基本上告诉我它找不到 "load_count" 即使它在那里。由于 JSON 周围没有 [] ,因此它不是对象的问题是什么?
这只是为我加载 JSON 的第二次尝试,另一个有效,我看到的唯一区别是缺少 []。
这就是我所说的:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"https://%s:%s@api.wistia.com/v1/stats/medias/c3e4797d8f.json", "api", "1b75e458de33a9b3f99d33f6bf409a7e145c570a"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSError *error;
NSURLResponse *response;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSMutableArray *videoDetail = [[NSMutableArray alloc] init];
// Get an array of dictionaries with the key "locations"
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// Iterate through the array of dictionaries
for(NSDictionary *dict in array)
// Create a new Location object for each one and initialise it with information in the dictionary
VideoDetail *videoD = [[VideoDetail alloc] initWithJSONDictionary:dict];
// Add the Location object to the array
[videoDetail addObject:videoD];
_textPlays.text = [NSNumberFormatter localizedStringFromNumber:videoD.plays numberStyle:NSNumberFormatterNoStyle];
【问题讨论】:
您是在解析字符串还是只是将 JSON 字符串传递给该方法? 你怎么称呼- (id)initWithJSONDictionary:(NSDictionary *)jsonDictionary
?
你必须先解析JSON。
使用 JSON 的第 1 条规则是,您不能“烹饪”它或修改您找到的示例。您必须真正研究从特定站点收到的 JSON 格式并了解它的结构,然后相应地编写代码。
【参考方案1】:
您收到的错误消息是让您知道您的 JSON 存储为字符串,而不是 NSDictionary
。您需要做的是转换您的 JSON。
由于你的 JSON 是一个字符串,所以先获取一个 NSData
对象:
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
然后使用NSJSONSerialization
类将其转换为NSDictionary
:
NSError* error = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
此时,您将拥有一个可以使用的NSDictionary
。
编辑:
看起来您正在尝试将您的 JSON 响应视为一个字典数组,但根据您在上面粘贴的 JSON 响应,您实际上只有一个字典。所以不要重复它,因为我相信这就是你遇到问题的原因。它只是遍历键,它们是字符串。
【讨论】:
所以不要在字典前使用数组?我编辑了我的帖子并包含了调用代码。 是的,没错。我刚刚根据您添加的代码在我的答案中添加了更多信息。【参考方案2】:让我们澄清一下:您发布的 JSON 是包含字典的文本。 JSON 文档要么只包含一个字典,要么只包含一个数组。
如果您将发布的 JSON 传递给 JSONObjectWithData,那么您将获得一个 NSDictionary*。将它存储在 NSArray* 中并不重要;编译器不知道它得到了什么,所以它允许赋值,但你仍然有一个 NSDictionary。
for 循环很有趣: for (... in ... ) 接受数组、字典、集合,并遍历数组、字典或集合中的值。所以你以为你遍历了一个数组,但实际上你遍历的是字典中的值,这些值都是字符串。和以前一样,您为 (NSDictionary* dict ...) 编写的事实并不重要,dict 将始终是一个 NSString。
这导致了你得到的错误:你向一个 NSString 发送了一个 objectForKey 方法,它当然没有办法处理它,并抛出一个异常。
【讨论】:
以上是关于JSON 和 iOS 7 错误的主要内容,如果未能解决你的问题,请参考以下文章
Restkit 0.22.0 和 iOS 7 RKObjectManager postObject 不生成 JSON 数据
JSON解析在IOS中得到错误NSErrorFailingURLKey