访问从 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 响应(在解析之前)包含完全命名为page
和 images
的两项吗?
您应该准确说明错误来自何处(哪一行)。你应该得到那个 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 [重复]