Iphone 除了我已经使用的方法之外,还有更好的方法来解析这个JSON吗?
我最近求助于从谷歌地图API获取我的邮政编码数据。在这个问题的末尾,我包含了一个从Google收到的JSON响应字符串的大片段 在我的代码深处,我得到了响应,并使用Jonathan Wight提供的库对其进行解析。这是我的密码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
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
).对我来说,这显然是一个更好的方法-现在投票赞成;我将使用代码来实现它,如果一切顺利,我将标记为接受-非常感谢!