我一整天都在看这个,寻找其他解决方案,但没有,我无法解决我的问题。
我想获得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"]
是否足以提取用户名?
答案 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"]);
}
}
}