访问从 NSJSONSerialization 生成的 NSDictionary 中的 JSON 数据

Posted

技术标签:

【中文标题】访问从 NSJSONSerialization 生成的 NSDictionary 中的 JSON 数据【英文标题】:Accessing JSON data inside an NSDictionary generated from NSJSONSerialization 【发布时间】:2011-12-21 10:20:20 【问题描述】:

在访问以下 URL (http://jamesstenson.com/portraits/?json=1) 中的 JSON 数据时遇到了一些问题,基本上我想访问“附件”下的“完整”“url”。我目前的代码如下:

NSError *e = nil;
NSData *jsonFeed = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://jamesstenson.com/portraits/?json=1"]]; 
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:jsonFeed options:NSJSONReadingMutableContainers error: &e];

if (!jsonData) 
    NSLog(@"Error parsing JSON: %@", e);
 else 

    for(NSDictionary *item in [jsonData objectForKey:@"page"]) 
        for(NSDictionary *attachment in [item objectForKey:@"images"]) 
            NSLog(@"%@", attachment);
        
    

这一直抛出一个错误:

2011-12-21 10:13:39.362 JSON[3463:f803] -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6a7b500

2011-12-21 10:13:39.363 JSON[3463:f803] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFString objectForKey:]:发送了无法识别的选择器到实例 0x6a7b500'

我知道我错误地访问了这些项目,但不知道如何实现这一点。我尝试了几种解决方案,例如http://blogs.captechconsulting.com/blog/nathan-jones/getting-started-json-ios5 - 但没有运气。我是 iOS 开发的新手,对 JSON 有一点了解。提前感谢大家的帮助。

【问题讨论】:

您确定您的 JSON 响应(在解析之前)包含完全命名为 pageimages 的两项吗? 您应该准确说明错误来自何处(哪一行)。你应该得到那个 JSON 的特定错误是没有意义的。但是您的基本问题是您从不提取“附件”数组。 @Hot Licks 错误在这一行 for(NSDictionary *item in [jsonData objectForKey:@"page"]) 错误说 [__NSCFString objectForKey:]: unrecognized selector ,让我知道你在我的回答中发现了什么错误 那么你从 JSON 解析器得到的是一个 NSString,而不是一个 NSDictionary,这意味着它解析的东西与你认为它解析的不同。 (在假设它是字典或数组之前检查对象类型总是明智的)。 【参考方案1】:

问题在于你的 for 循环

for(NSDictionary *item in [jsonData objectForKey:@"page"]) 

您不会在 item 中获得 NSDictionary,它会返回 Dictionary 的键,即 NSString

查看此链接for each loop in objective c for accessing NSMutable dictionary 了解如何遍历 NSDictionay

以下是根据您的要求修改的代码,可能会对您有所帮助

if (!jsonData) 
        NSLog(@"Error parsing JSON: %@", e);  else 
        NSArray *attachments = [[jsonData objectForKey:@"page"] objectForKey:@"attachments"];
        for(NSDictionary *object in attachments) 
              NSLog(@"%@", [object objectForKey:@"images"]);
              NSLog(@"%@", [[[object objectForKey:@"images"] objectForKey:@"full"] objectForKey:@"url"]);
         

【讨论】:

@Hot Licks 否决我的答案的原因是什么,你能告诉我,以便我更正自己 嘿,这太棒了!很近!那么如何访问完整大小的 URL?如果您能告诉我如何在 NSLog 函数中将其吐出,我会非常高兴并用绿色勾号标记您的答案! :D NSLog(@"%@", [[[object objectForKey:@"images"] objectForKey:@"full"] objectForKey:@"url"]); "你不会在 item 中得到 NSDictionary,它会返回 Dictionary 的 key,即 NSString" 非常感谢@Nakkeeran :D

以上是关于访问从 NSJSONSerialization 生成的 NSDictionary 中的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?

从特定 url 提取数据时 NSJSONSerialization 崩溃

如何使用 NSJSONSerialization 从 JSON 对象中获取值

NSJSONSerialization 将日期分隔符从 yyyy/MM/dd 更改为 yyyy\/MM\/dd [重复]

如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据

NSJSONSerialization - 无法将数据转换为字符串