如何从JSON加载并解析到iOS 5上的tableView

时间:2012-12-21 23:21:14

标签: ios json parsing ios5 tableview

我有一个流式传输链接的音频播放器,我想通过JSON将链接加载到tableView中。

继承我的tableView,显示链接:(已经过评论,但没有json工作)

/*
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    int row = indexPath.row;

    [[cell textLabel] setText:[_radioNames objectAtIndex:row]];
    [[cell detailTextLabel] setText:[_radioSubtitles objectAtIndex:row]];
    if(row == _currentRadio) {
        [cell setAccessoryView:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"now_playing.png"]] autorelease]];
    } else {
        [cell setAccessoryView:nil];
    }


    return cell;
}
 */

下面是我获取JSON文件的地方:

// Download JSON
    NSString *jsonString = [NSString
                            stringWithContentsOfURL:[NSURL URLWithString:@"http://www.xxxxxxxxx/radioliste.json"]
                            encoding:NSStringEncodingConversionAllowLossy
                            error:nil];
    // Create parser
    SBJSON *parser = [[SBJSON alloc] init];
    NSDictionary *results = [parser objectWithString:jsonString error:nil];
    [parser release], parser = nil;
    // Set tableData
    [self setTableData:[results objectForKey:@"items"]];

    NSLog(jsonString); // THIS IS SHOWING ME THE WHOLE JSON FILE, DON'T KNOW IF THAT OK?

继承JSON数据主义者:(或者我认为)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        // Change UITableViewCellStyle
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleSubtitle
                 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Get item from tableData
    NSDictionary *item = [tableData objectAtIndex:[indexPath row]];
    // Set text on textLabel
    [[cell textLabel] setText:[item objectForKey:@"title"]];
    // Set text on detailTextLabel
    [[cell detailTextLabel] setText:[item objectForKey:@"description"]];

    return cell;
}

继承我的JSON文件:

{
    "radioliste": {
    "items": [
        {
            "id": "The Voice",
            "string": "Afspil The Voice",
            "string": "LINK"
        }
    ]
    }
}

所以继续我的问题......如何从JSON文件中加载正确的流链接并将它们解析为tableView?并且JSON文件是否有效?

2 个答案:

答案 0 :(得分:1)

如何使用这样的原生JSON库:

NSData* data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];

NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:(__bridge NSData *)data options:NSJSONReadingMutableContainers error:nil];

而不是SBJSON?

编辑:刚刚注意到你的JSON存在一些问题。字典中有一个重复的键:string。

答案 1 :(得分:1)

首先,不要使用initWithContentsOfURL ...这是一个阻止调用,会冻结你的应用程序。在异步模式下使用NSURLConnection从网络获取数据。

其次,NSJSONSerialization自iOS 5开始提供。使用它。

因此,NSURLConnection将构建一个NSData。 NSJSONSerialization JSONObjectWithData:将该NSData转换为对象。在您的情况下,它将是一个NSDictionary。

您粘贴的JSON文件与您在cellForRowAtIndexPath中使用的对象键名称不匹配。我不确定会发生什么,因为第一项中的两个键是“string”。但假设你的意思是冠军和描述,你可以使用类似的东西:

cell.textLabel.text = tableData[@"items"][indexPath.row][@"title"];

将标题输入表格单元格。