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



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

我想获取 https://alpha-api.app.net/stream/0/posts/stream/global 的 JSON,解析它,以便我可以提取用户名以及将来的其他属性,如帖子、头像......这是我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"]足以提取用户名吗?

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

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

所以应该是,

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

并且您的逻辑应该相应地调整。

时间轴数据包含在字典中,可以通过键"data"访问。我会做一些类似的事情:

- (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: %@nn", [user objectForKey:@"username"]);
    }
}
}

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

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

最新更新