获取JSON并尝试解析它时出错[iOS]

时间:2014-01-13 20:20:11

标签: ios objective-c json parsing

我一整天都在看这个,寻找其他解决方案,但没有,我无法解决我的问题。

我想获得https://alpha-api.app.net/stream/0/posts/stream/global的JSON,解析它以便我可以提取用户名以及将来的其他属性,如post,avatar ... 这是我的viewDidLoad,我在其中设置了与URL的连接,然后将其更改为NSData对象。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                      URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request
                                         returningResponse:nil error:nil];
NSError *jsonParsingError = nil;
NSArray *timeline= [NSJSONSerialization JSONObjectWithData:response
                                                          options:0 error:&jsonParsingError];
NSDictionary *user;
for(int i=0; i<[timeline count];i++)
{
    user = [timeline objectAtIndex:i];
    NSLog(@"Statuses: %@", [user objectForKey:@"username"]);
}

我的程序开始运行然后停止。我知道它何时停止(user = [timeline objectiAtIndex:i])但我不知道为什么......另一个问题:[user objectForKey:@"username"]是否足以提取用户名?

4 个答案:

答案 0 :(得分:1)

您收到错误,因为以下行返回NSDictionary,而不是NSArray。

NSArray* timeline= [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];

应该是,

NSDictionary* timeline= [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];

你的逻辑应该相应调整。

答案 1 :(得分:0)

Web服务可能正在返回JSON字典而不是数组。这会导致无法识别的选择器异常抛出[timeline objectAtIndex:i]。打印出调试器中返回的请求,如果是字典,您需要在迭代之前找到如何访问您期望的数组。

答案 2 :(得分:0)

当您检索的数据结构表明它实际上是NSDictionary时,您的解析逻辑错误地假设时间轴将是NSArray。

答案 3 :(得分:0)

时间线数据包含在字典中,可通过键“数据”访问。我会按照以下方式做点什么:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                      URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request
                                         returningResponse:nil error:nil];
NSError *jsonParsingError = nil;
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];
NSArray *timelineArray;

if (responseObject) {
    timelineArray = [responseObject objectForKey:@"data"];

    NSDictionary *user; // user data

    for (NSDictionary *status in timelineArray) {
        user = [status objectForKey:@"user"];

        NSLog(@"Status: %@", [status objectForKey:@"text"]);
        NSLog(@"Status by user: %@\n\n", [user objectForKey:@"username"]);
    }
}
}