我最近有办法从Google Maps API获取我的邮政编码数据。在这个问题的最后,我收录了一小段我从Google收到的JSON响应字符串。
我的代码深入了解响应,然后使用Jonathan Wight的TouchJSON库解析它。这是我的代码
NSStringEncoding encoding;
// Fetch data from web service.
NSString *jsonString = [NSString stringWithContentsOfURL:url usedEncoding:&encoding error:nil];
// Process JSON data returned from web service.
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil];
if (jsonString == nil)
{
// bah
} else if (![self isCancelled]) {// Check to see if we have been cancelled.
if (dictionary) {
NSArray* results = [dictionary objectForKey:@"results"];
NSDictionary* types = [results objectAtIndex:1];
NSArray* address_components = [types objectForKey:@"address_components"];
NSDictionary* postcodes = [address_components objectAtIndex:0];
NSString* postcode = [postcodes objectForKey:@"long_name"];
// do stuff with the postcode
}
//
}
注意我是如何通过在NSArray中使用特定偏移来获取类型字典和邮政编码字典的。我的问题是这个,
如何解析JSON字符串(最好使用TouchJSON)而不必对这些数组偏移进行硬编码?
令我感到震惊的是,Google地图的响应字符串可能会发生变化,我的硬编码方法会在此时停止工作。有没有人使用类似但更强大的方法,他们愿意在这里分享?
... Google Maps API样本回复字符串...“目标”邮政编码以粗体突出显示
{“status”:“确定”,“结果”:[{ “types”:[“street_address”], “formatted_address”:“9 Clarendon Pl,Leamington Spa,Warwickshire CV32 5,UK”, “address_components”:[{ “long_name”:“9”, “short_name”:“9”, “类型”:[“street_number”] },{ “long_name”:“Clarendon Pl”, “short_name”:“A452”, “类型”:[“路线”] },{ “long_name”:“Leamington Spa”, “short_name”:“Leamington Spa”, “类型”:[“地方”,“政治”] },{ “long_name”:“Warwick”, “short_name”:“Warwick”, “types”:[“administrative_area_level_3”,“政治”] },{ “long_name”:“沃里克郡”, “short_name”:“Warks”, “types”:[“administrative_area_level_2”,“政治”] },{ “long_name”:“英格兰”, “short_name”:“英格兰”, “types”:[“administrative_area_level_1”,“政治”] },{ “long_name”:“英国”, “short_name”:“GB”, “类型”:[“国家”,“政治”] },{ “long_name”:“CV32 5”, “short_name”:“CV32 5”, “types”:[“postal_code_prefix”,“postal_code”] }], “几何”:{ “地点”: { “lat”:52.2919849, “lng”: - 1.5399505 }, “location_type”:“RANGE_INTERPOLATED”, “viewport”:{ “西南”:{ “lat”:52.2888374, “lng”: - 1.5431216 }, “东北”:{ “lat”:52.2951326, “lng”: - 1.5368264 } }, “bounds”:{ “西南”:{ “lat”:52.2918320, “lng”: - 1.5399760 }, “东北”:{ “lat”:52.2921380, “lng”: - 1.5399720 } } },{ “types”:[“postal_code”], “formatted_address”:“Leamington Spa,Warwickshire CV32 5LD,UK”, “address_components”:[{ “long_name”:“CV32 5LD”, “short_name”:“CV32 5LD”, “types”:[“postal_code”] },{ “long_name”:“Leamington Spa”, “short_name”:“Leamington Spa”, “类型”:[“地方”,“政治”] },.........更多JSON如下
答案 0 :(得分:2)
我从未使用 TouchJSON ,但在我看来,您的硬编码偏移是因为您只需要一个结果,但Google Maps API足够灵活,可以返回多个结果。实际上,如果你有objectAtIndex:1
表示你正在使用第二个结果集,那么你编写的代码实际上取决于至少有两个结果。
即使我在那里弄错了细节,我怀疑你真正想做的事情而不是NSDictionary* types = [results objectAtIndex:1];
更像是:
NSDictionary* types = [results objectAtIndex:[results indexOfObjectPassingTest:yourPredicateHere]];
如果您不知道谓词是如何工作的,那么您首先要阅读Apple的谓词编程指南,以了解如何设置谓词(我在上面标记为yourPredicateHere
的内容)。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/predicates.html