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 和 php 的 iOS 错误

JSON解析在IOS中得到错误NSErrorFailingURLKey

在 iOS 错误中解析 JSON 图像 url

升级到 Xcode 4 和 iOS 4.3 后的 iPhone JSON 错误

捆绑安装错误“安装 json (1.7.3) 时发生错误”