Таблица расстояний Google APi (JSON PARSING) - PullRequest
0 голосов
/ 10 марта 2012

Я новый программист.и я использую 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&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);
}

Ответы [ 5 ]

0 голосов
/ 25 апреля 2017

Попробуйте использовать этот 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;
0 голосов
/ 10 марта 2012
0 голосов
/ 10 марта 2012

Я использую библиотеку 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

0 голосов
/ 10 марта 2012

Привет Гаурав,

Я попробовал это для вашего ответа URL.

Чтобы получить правильную древовидную структуру, посетите это.

пожалуйста, проверьте этот код.

попробуйте это в 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"]);

надеюсь, что это поможет вам грипп.

0 голосов
/ 10 марта 2012

В чем именно ваша проблема?

  • Выборка данных?
  • Или анализ 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);
}

Попробуйте это.Вы иногда ссылались на responseceData, а иногда на receiveData.Я исправил это и название метода.Кроме того, вы пытались зарегистрировать responseData, а не String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...