Google Distance Matrix APi(JSON PARSING)

时间:2012-03-10 12:30:32

标签: iphone ios json google-maps

我是新程序员。我正在使用Google Distance Matrix 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&安培;传感器=假

由于

当我使用以下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);
}

5 个答案:

答案 0 :(得分:0)

你的问题究竟是什么?

  • 获取数据?
  • 或解析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);
}

试试这个。您有时会引用responceData,有时会引用receiveData。我修复了该方法的名称。另外,您试图记录responseData而不是String。

答案 1 :(得分:0)

答案 2 :(得分:0)

请尝试使用此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;

答案 3 :(得分:-1)

我使用此处提供的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文件中包含相关的库

答案 4 :(得分:-1)

嗨Gaurav,

我尝试了这个用于您的给定网址响应。

要获得正确的树状结构,请访问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"]);

希望这对你有帮助。