我是新程序员。我正在使用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);
}
答案 0 :(得分:0)
你的问题究竟是什么?
-(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"]);
希望这对你有帮助。