NSJSONSerialization Json 嵌套子

Posted

技术标签:

【中文标题】NSJSONSerialization Json 嵌套子【英文标题】:NSJSONSerialization Json Nested Sub 【发布时间】:2013-02-22 11:32:37 【问题描述】:

我试图深入到嵌套的 JSon 数组中,我已经成功地完成了上面的级别,但我不知道如何更深入。

我需要记录图像@url 我已附加屏幕显示以显示我需要它去哪里。

谢谢:)

- (void)viewDidLoad

    [super viewDidLoad];


    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    NSURL *url = [NSURL URLWithString:@"http://api.storageroomapp.com/accounts/511a4f810f66026b640007b8/collections/511a51580f66023bff000ce9/entries.json?auth_token=Zty6nKsFyqpy7Yp5DP1L&preview_api=1"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];




-(void)connectionDidFinishLoading:(NSURLConnection *) connection
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];

    NSDictionary *arrayDictionary = dictionary[@"array"];

    news = arrayDictionary[@"resources"];

    [tableView reloadData];






-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"The data could not be downloaded - please make sure you're connected to either 3G or Wi-FI" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [errorView show];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;



-(int)numberOfSectionsInTableView:(UITableView *)tableView
    return  1;



-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    return [news count];




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSDictionary *newsItem = news[[indexPath row]];


    NSString *title = newsItem[@"title"];
    NSString *date = newsItem[@"date"];
    NSString *thumb = newsItem[@"tablethumb"];




    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if (cell == nil) 
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];

        [[cell textLabel] setText:title];
        [[cell detailTextLabel] setText:date];





        if((NSNull *)thumb == [NSNull null])
            NSLog(@"no image");
         else
            NSLog(@ "image = %@", thumb);

        


    
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;

【问题讨论】:

【参考方案1】:

对于遍历嵌套对象,您可以使用valueForKeyPath 方法并使用点语法来深入了解层次结构。

这样的事情会从您的 newsItem 字典中获取 url 值:

NSDictionary *newsItem = news[[indexPath row]];
NSString *thumbUrl = [newsItem valueForKeyPath:@"tablethumb.url"];

PS。如果您确实拥有以@ 为前缀的属性,那么使用valueForKeyPath 可能会遇到麻烦,因为@ is a special token used as an operator。在这种情况下,您可以这样做:

NSDictionary *newsItem = news[[indexPath row]];
id tablethumb = [newsItem objectForKey:@"tablethumb"];
NSString *thumbUrl = @"";
// Check if not null and access the @url
if (tablethumb != [NSNull null])
  thumbUrl = tablethumb[@"@url"];

【讨论】:

感谢您的快速响应我尝试了上面的代码并且我的控制台说。 image = (null),然后我尝试@"tablethumb.@url" 并在 NSUnkownKeyException 的最后一个日志中得到错误。 是的,刚刚意识到您有实际的 @ 作为前缀。查看我编辑的答案 @BrentFrench 另请注意,在您的代码中,您将tablethumb 视为一个字符串,而在您的 json 中它是一个字典... 你这是什么意思?对不起 我的意思是你这样做:NSString *thumb = newsItem[@"tablethumb"];tablethumb 实际上是字典,而不是字符串。【参考方案2】:

尝试像这样从字典中访问值,

NSLog(@"URL: %@",[newsItem objectForKey:@"@url"]);

【讨论】:

这不起作用,因为顶层已经有一个 url。还是谢谢

以上是关于NSJSONSerialization Json 嵌套子的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSJSONSerialization 解析 JSON - 抛出 NSException

使用 NSJSONSerialization 解析 twitter 搜索 json 数据

为啥 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?

使用 NSJSONSerialization 反序列化压缩的 JSON 文件

iOS:NSJSONSerialization:错误的代码或错误的 JSON 结构?

NSDictionary 到 JSON 与 NSJSONSerialization 问题