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

Iphone 除了我已经使用的方法之外,还有更好的方法来解析这个JSON吗?,iphone,json,google-maps,Iphone,Json,Google Maps,我最近求助于从谷歌地图API获取我的邮政编码数据。在这个问题的末尾,我包含了一个从Google收到的JSON响应字符串的大片段 在我的代码深处,我得到了响应,并使用Jonathan Wight提供的库对其进行解析。这是我的密码 NSStringEncoding encoding; // Fetch data from web service. NSString *jsonString = [NSString stringWithContentsOfURL:url usedEncoding:&a

我最近求助于从谷歌地图API获取我的邮政编码数据。在这个问题的末尾,我包含了一个从Google收到的JSON响应字符串的大片段

在我的代码深处,我得到了响应,并使用Jonathan Wight提供的库对其进行解析。这是我的密码

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),而不必硬编码那些数组偏移量?

我突然想到,谷歌地图的响应字符串可能会发生变化,而我的硬编码方法将在这一点上停止工作。有没有人使用过类似但更稳健的方法,他们也愿意在这里分享

…谷歌地图API示例响应字符串。。。“目标”邮政编码以粗体突出显示

{“状态”:“确定”,“结果”:[{ “类型”:[“街道地址”], “地址”:“英国沃里克郡利明顿水疗中心克拉伦登9号,邮编32 5”, “地址/组件”:[{ “long_name”:“9”, “短名称”:“9”, “类型”:[“街道编号”] }, { “long_name”:“Clarendon Pl”, “短名称”:“A452”, “类型”:[“路线”] }, { “long_名称”:“利明顿水疗中心”, “短名称”:“利明顿水疗中心”, “类型”:[“地区”、“政治”] }, { “long_name”:“Warwick”, “短名称”:“沃里克”, “类型”:[“行政区\级别\ 3”,“政治”] }, { “龙_名称”:“沃里克郡”, “短名称”:“沃克斯”, “类型”:[“行政区\级别\ 2”,“政治”] }, { “long_名称”:“英格兰”, “简称”:“英格兰”, “类型”:[“行政区”和“一级”,“政治”] }, { “long_名称”:“英国”, “短名称”:“GB”, “类型”:[“国家”、“政治”] }, { “long_name”:“CV32 5”, “短名称”:“CV32 5”, “类型”:[“邮政编码\前缀”,“邮政编码”] } ], “几何学”:{ “地点”:{ “lat”:52.2919849, “液化天然气”:-1.5399505 }, “位置类型”:“插值范围”, “视口”:{ “西南”:{ “lat”:52.2888374, “液化天然气”:-1.5431216 }, “东北”:{ “lat”:52.2951326, “液化天然气”:-1.5368264 } }, “界限”:{ “西南”:{ “lat”:52.2918320, “液化天然气”:-1.5399760 }, “东北”:{ “lat”:52.2921380, “液化天然气”:-1.5399720 } } } }, { “类型”:[“邮政编码”], “地址”:“英国沃里克郡利明顿水疗中心CV32 5LD”, “地址/组件”:[{ “长名称”:“CV32 5LD”, “短名称”:“CV32 5LD”, “类型”:[“邮政编码”] }, { “long_名称”:“利明顿水疗中心”, “短名称”:“利明顿水疗中心”, “类型”:[“地区”、“政治”] },更多的JSON如下

我从未使用过TouchJSON,但在我看来,您的硬编码偏移量是存在的,因为您只需要一个结果,但Google Maps API足够灵活,可以返回多个结果。事实上,如果您有
objectAtIndex:1
,则表明您使用的是第二个结果集,因此您编写的代码实际上取决于至少有两个结果

即使我把细节搞错了,我也怀疑你真正想做什么,而不是
NSDictionary*types=[results objectAtIndex:1];
更像是:

NSDictionary* types = [results objectAtIndex:[results indexOfObjectPassingTest:yourPredicateHere]];

如果您不知道谓词是如何工作的,那么您应该先阅读Apple的谓词编程指南,以了解如何设置谓词(我在上面标记的
yourpeditehere
).

对我来说,这显然是一个更好的方法-现在投票赞成;我将使用代码来实现它,如果一切顺利,我将标记为接受-非常感谢!