【问题标题】:The Google Distance Matrix APi (JSON PARSING)Google 距离矩阵 API(JSON 解析)
【发布时间】:2012-03-27 15:12:55
【问题描述】:

我是新程序员。我正在使用谷歌距离矩阵 API。我是第一次使用 JSON 。我使用以下但无法从服务器获得响应..请给我几行代码以使用 JSON 并获取两个地方之间的公里距离。

http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&sensor=false

谢谢

当我使用以下 API 时,我会收到响应

- (void)viewDidLoad  {

    [super viewDidLoad]; 

    NSLog(@"viewdidload");
    responseData = [[NSMutableData data] retain]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:
                             [NSURL URLWithString:@"http://api.kivaws.org/v1/loans/search.json?status=fundraising"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];

  }

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{

    NSLog(@"didReceiveResponse");
   [responseData setLength:0];

  }

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

 {        
    [responseData appendData:data]; 
 }

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{    
    NSLog(@"didFailWithError");
    label.text = [NSString stringWithFormat:@"Connection failed: %@",
                                            [error description]];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

 {
    NSLog(@"connectionDidFinishLoading");   
    NSString* newStr = [[NSString alloc] initWithData:receivedData
                                             encoding:NSUTF8StringEncoding];
    [self handleResponce:newStr];
   // NSLog(@"%@",newStr);
 }

-(void)handleResponce:(NSString *)data

{
    NSLog(@"receive data is --------->%@",receiveData);
}

【问题讨论】:

  • 请正确格式化所有代码。它现在不那么可读了。

标签: iphone ios json google-maps


【解决方案1】:

你的问题到底是什么?

  • 正在获取数据?
  • 还是解析 JSON?
-(void)viewDidLoad{
    [super viewDidLoad];
    NSLog(@"viewdidload");  
    responseData = [[NSMutableData alloc] init];  
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC%7CSeattle&destinations=San+Francisco%7CVictoria+BC&mode=bicycling&language=fr-FR&sensor=false"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"didReceiveResponse");
    [responseData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"didFailWithError");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"connectionDidFinishLoading");
    NSString* newStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [self handleResponse:newStr]; // NSLog(@"%@",newStr);
}
-(void)handleResponse:(NSString *)string{
    NSLog(@"responseData data is --------->%@",string);
}

试试这个。您有时指的是 responseData,有时指的是 receiveData。我修复了它和方法的名称。另外,您试图记录 responseData 而不是 String。

【讨论】:

【解决方案2】:
【解决方案3】:

尝试改用此 API:afGoogleMapsAPI-WS-iOS

如何使用

afGMapsDistanceRequest *req = [afGMapsDistanceRequest distanceRequest];

req.afDelegate = self;

NSMutableArray *orAr = [NSMutableArray array];

[orAr addObject:@"Paris"];
[orAr addObject:@"Berlin"];

NSMutableArray *deAr = [NSMutableArray array];

[deAr addObject:@"Marseille"];
[deAr addObject:@"Barcelone"];

[req setOrigins:orAr];

[req setDestinations:deAr];

[req setUseSensor:YES];
[req setUseHTTPS:NO];

[req setAvoidMode:AvoidModeTolls]; //optional, none default

[req setUnitsSystem:UnitsMetric]; //optional, metrics default

[req setTravelMode:TravelModeDriving]; //optional, driving default

[req startAsynchronous];

然后,只需让您的类继承 afGoogleMapsDistanceDelegate 协议,并实现以下委托函数(如果需要,都是可选的):

 -(void) afDistanceWSStarted:(afGMapsDistanceRequest *)ws ;

 -(void) afDistanceWS:(afGMapsDistanceRequest *)ws gotDistance:(NSNumber *) distance unit:(UnitsSystem)unit;

 -(void) afDistanceWSFailed:(afGMapsDistanceRequest *)ws withError:(NSString *)er;

 -(void) afDistanceWS:(afGMapsDistanceRequest *)ws origin:(NSString *) origin destination:(NSString *)destination failedWithError:(NSError *) err;

 -(void) afDistanceWS:(afGMapsDistanceRequest *)ws distance:(NSNumber *) distance origin:(NSString *) origin destination:(NSString *)destination unit:(UnitsSystem)unit;
This request will give you all the informations availbale. Variables called "returnedXXX" like "returnedDest" are the returned descriptions of GoogleMaps API WS.

 -(void) afDistanceWS:(afGMapsDistanceRequest *)ws distance:(NSNumber *) distance textDistance:(NSString *)textDistance origin:(NSString *) origin returnedOrigin:(NSString *)returnedOrigin destination:(NSString *)destination returnedDestination:(NSString *)returnedDest duration:(NSNumber *)durationInSec textDuration:(NSString *)textDuration unit:(UnitsSystem)unit;

【讨论】:

    【解决方案4】:

    我使用此处提供的 TouchJSON 库

    https://github.com/TouchCode/TouchJSON

    单独做某事:

    // For the purpose of this example, use stringWithContentsOfURL
    NSString *googleURL = @"http://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&sensor=false";
    
    NSURL *url = [NSURL
                  URLWithString:[googleURL
                                 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
    NSError *error = NULL;
    NSString *theJSONString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    
    NSLog(@"%@", theJSONString);
    
    // Parse with TouchJSON
    NSDictionary *replyDict = [NSDictionary dictionaryWithJSONString:theJSONString error:&error];
    
    NSString *distanceString = [[[[[[replyDict objectForKey:@"rows"] objectAtIndex:0]
                                   objectForKey:@"elements"]
                                  objectAtIndex:0]
                                 objectForKey:@"distance"]
                                objectForKey:@"value"];
    
    double distance = distanceString.doubleValue;
    
    NSLog(@"Distance: %f", distance);
    NSLog(@"Error: [%@]", error.description);
    

    这在控制台上给了我以下输出:

    {
       "destination_addresses" : [ "San Francisco, Californie, États-Unis", "Victoria, BC, Canada" ],
       "origin_addresses" : [ "Vancouver, BC, Canada", "Seattle, État de Washington, États-Unis" ],
       "rows" : [
          {
             "elements" : [
                {
                   "distance" : {
                      "text" : "1 686 km",
                      "value" : 1685690
                   },
                   "duration" : {
                      "text" : "3 jours 21 heures",
                      "value" : 336418
                   },
                   "status" : "OK"
                },
                {
                   "distance" : {
                      "text" : "136 km",
                      "value" : 136478
                   },
                   "duration" : {
                      "text" : "6 heures 59 minutes",
                      "value" : 25117
                   },
                   "status" : "OK"
                }
             ]
          },
          {
             "elements" : [
                {
                   "distance" : {
                      "text" : "1 426 km",
                      "value" : 1426087
                   },
                   "duration" : {
                      "text" : "3 jours 6 heures",
                      "value" : 281311
                   },
                   "status" : "OK"
                },
                {
                   "distance" : {
                      "text" : "251 km",
                      "value" : 251174
                   },
                   "duration" : {
                      "text" : "12 heures 6 minutes",
                      "value" : 43583
                   },
                   "status" : "OK"
                }
             ]
          }
       ],
       "status" : "OK"
    }
    Distance: 1685690.000000
    Error: [(null)]
    

    如果你想改用 SBJson,你可以在这里得到它

    https://github.com/stig/json-framework

    换行

    // Parse with TouchJSON
    NSDictionary *replyDict = [NSDictionary dictionaryWithJSONString:theJSONString error:&error];
    

    // Parse with SBJson
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *replyDict = [parser objectWithString:theJSONString];
    

    记得在你的 .h 文件中包含相关的库

    【讨论】:

    • 这是一个同步请求,它会阻塞你的线程直到请求完成。没有 UI 响应等。他擅长异步执行,这要好得多。
    • @Niels Castle...感谢您抽出宝贵的时间。我可以在 SBJson 的帮助下获取与 JSONSting 的距离吗?再次感谢
    • Jep,示例阻塞并且没有错误检查。问题标题是“JSON 解析”,所以我专注于此。
    【解决方案5】:

    嗨,高拉夫,

    我为您给定的 URL 响应尝试了这个。

    要获得正确的树结构,请访问this.

    请检查此代码。

    didReceiveData 委托方法中试试这个

     NSString *serverOutput = [[[NSString alloc] initWithData:data encoding: NSASCIIStringEncoding] autorelease];
        SBJSON *parser = [[SBJSON alloc] init];
    
        // Get all data using this dic :) ;) text content twits.
    
        NSDictionary *dic = [parser objectWithString:serverOutput error:nil];
        NSLog(@"Response Dictionary ::: %@",dic);
    
        NSLog(@"Distance ::: %@",[[[[dic valueForKey:@"rows"] valueForKey:@"elements"] valueForKey:@"distance"] valueForKey:@"value"]);
    

    希望这个对你有帮助。

    【讨论】:

    • 他的问题不是解析数据,而是获取数据。我承认他没有说清楚。