除了我已经使用的JSON之外,还有更好的方法来解析这个JSON吗?

时间:2011-05-19 13:34:32

标签: iphone json google-maps

我最近有办法从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如下

1 个答案:

答案 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