如何从json webservice获取数据

时间:2012-10-01 09:00:52

标签: objective-c ios json nsdictionary

我有一个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 RacingGenk [13434:c07](null)

有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

您的端点发出DNS错误,这可能解释了您没有数据的原因,但假设您可能已经对其进行了分析,则有很多方法可以自行调试。

首先不要像这样链接方法调用;

  NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];

取而代之的是(并特别注意您从一次调用中错过了错误响应);

   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]); 
   }

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

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

我没有语法检查上面的内容,因为我在PC上输入了它,但它应该指向正确的方向。

答案 1 :(得分:-1)

我建议使用AFNetworking,它可以更轻松地处理JSON / XML以及整体的Web请求。你可以在这里阅读... https://github.com/AFNetworking/AFNetworking

来自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];