Objective c 如何从json Web服务获取数据

Objective c 如何从json Web服务获取数据,objective-c,ios,json,nsdictionary,Objective C,Ios,Json,Nsdictionary,我有一个webmethod,它返回大量json数据。 我有一个单独的类,在那里我获取数据。在这节课上,我做了以下几点 + (NSDictionary *)executeGenkFetch:(NSString *)query { query = [NSString stringWithFormat:@"%@&format=json&nojsoncallback=1", query]; query = [query stringByAddingPercentEscap

我有一个webmethod,它返回大量json数据。 我有一个单独的类,在那里我获取数据。在这节课上,我做了以下几点

+ (NSDictionary *)executeGenkFetch:(NSString *)query
{
    query = [NSString stringWithFormat:@"%@&format=json&nojsoncallback=1", query];
    query = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // NSLog(@"[%@ %@] sent %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), query);
    NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;
    NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;
    if (error) NSLog(@"[%@ %@] JSON error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription);
    // NSLog(@"[%@ %@] received %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), results);
    return results;
}

+ (NSArray *)GetNieuws
{
    NSString *request = [NSString stringWithFormat:@"http://www.krcTest.be/mobile/json/request/webmethod"];
    return [[self executeGenkFetch:request] valueForKeyPath:@"news.title"];
}
现在我有了一个按钮来对数据进行NSLog。这里你可以看到按钮后面的动作

- (IBAction)testFetch:(id)sender {
    NSArray *nieuws;
    nieuws = [GenkData GetNieuws];
    NSLog(@"%@",nieuws);

}
在我的日志中总是显示这个

2012-10-01 10:52:16.379拉辛根[13434:c07](空)


有人能帮我吗?

我建议使用AFNetworking,它可以使处理JSON/XML以及整个web请求变得更容易。你可以在这里读到

来自GitHub自述文件的JSON示例请求

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"Public Timeline: %@", JSON);
} failure:nil];
[operation start];

您的端点给出了一个DNS错误,这可能解释了您没有数据的原因,但是假设您已经指定了它,那么您可以自己调试它

首先不要像这样将方法调用链接在一起

  NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
取而代之的是prefer(特别要注意的是,您在一次调用中丢失了错误响应)

通过不将方法调用链接在一起,现在可以打印中间结果以查看问题所在,还可以使用断点更好地逐步解决问题

在这里,将这样的方法作为类方法而不是实例方法是很奇怪的,您应该知道,这样的同步网络使用将破坏您的UI性能,除非您是在另一个线程上执行的,我怀疑您不是。您可能希望查看NSURLConnection的异步网络方法

我没有检查上面的语法,因为我是在PC上输入的,但它应该为您指出正确的方向

   NSError *error = nil;
   NSURL *request = [NSURL URLWithString:query];
   NSLog(@"Outgoing Request: %@",[request description]);
   NSString *response =  [NSString stringWithContentsOfURL:request encoding:NSUTF8StringEncoding error:nil];

   if (error) { 
       NSLog(@"ERROR: Unable to get response %@",[error localizedDescription]); 
   }

   NSLog("@Synchronous Response: %@",response);

   NSData *jsonData = [response dataUsingEncoding:NSUTF8StringEncoding];
   NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];

   if (error) { 
       NSLog(@"ERROR: Unable to parse JSON %@",[error localizedDescription]); 
   }