解析foursquare为iPhone返回的json给出了无法识别的主角
Posted
技术标签:
【中文标题】解析foursquare为iPhone返回的json给出了无法识别的主角【英文标题】:Parsing json returned by foursquare for iPhone gives Unrecognised leading character 【发布时间】:2011-11-05 06:25:51 【问题描述】:我正在尝试使用foursquare api 获取附近的地方。 这是从
返回的json数据 NSDictionary *results = [jsonString JSONValue];
NSLog(@"%@", results);
(
code = 200;
errorDetail = "This endpoint will stop returning groups in the future. Please use a current version, see http://bit.ly/lZx3NU.";
errorType = deprecated;
,
groups = (
items = (
categories = (
icon = "https://foursquare.com/img/categories/parks_outdoors/default.png";
id = 4bf58dd8d48988d163941735;
name = Park;
parents = (
"Great Outdoors"
);
pluralName = Parks;
primary = 1;
shortName = Park;
);
然后我尝试获取数组中的组列表
NSArray *groups = [ (NSDictionary *)results objectForKey:@"groups"];
这会返回以下错误
2011-11-05 11:42:12.907 XperienzApp[1972:207] No of results returned: 0 Results : (null)
2011-11-05 11:42:13.225 XperienzApp[1972:207] -JSONValue failed. Error trace is: (
"Error Domain=org.brautaset.JSON.ErrorDomain Code=3 \"Unrecognised leading character\" UserInfo=0x5849cd0 NSLocalizedDescription=Unrecognised leading character"
)
2011-11-05 11:42:13.225 XperienzApp[1972:207] No of results returned: 0 Results : (null)
我应该如何解析这个?
编辑: 我尝试了建议的技术,这给了我一个数组
id groups = [[(NSDictionary *)results objectForKey:@"response"] objectForKey:@"groups"];
if ([results count] > 1)
NSLog(@"groups class %@\ngroups %@ %d", groups, [groups class], [groups count]);
日志输出格式为:
categories = (
icon = "https://foursquare.com/img/categories/nightlife/danceparty.png";
id = 4bf58dd8d48988d11f941735;
name = Nightclub;
parents = (
"Nightlife Spots"
);
pluralName = Nightclubs;
primary = 1;
shortName = Nightclub;
);
contact =
;
hereNow =
count = 0;
;
id = 4eb33ba561af0dda8f673c1b;
location =
address = "144 Willow St 4R";
city = ***lyn;
crossStreet = Pierrepont;
distance = 462;
lat = "40.696864";
lng = "-73.996409";
postalCode = 11201;
state = NY;
;
name = "Entertainment 720, Ltd.";
stats =
checkinsCount = 3;
tipCount = 0;
usersCount = 1;
;
verified = 0;
);
name = Nearby;
type = nearby;
)
groups __NSArrayM 1
这又不是 json 并且很难解析,我如何获得 json 中的输出。
【问题讨论】:
【参考方案1】:我是foursquare 的iPhone 主管。我会尝试看看这里发生了什么。
首先,我强烈建议您使用 JSONKit 作为解析器。它轻巧且速度极快:https://github.com/johnezang/JSONKit
看来您正在正确解析 JSON 并正确获取字典。然后你记录解析的对象,而不是原始的 JSON。您看到的输出是 Objective-C 如何选择将已解析的字典序列化为文本。它绝对不是 JSON。使用 JSONKit,您可以将 JSONString 选择器发送到您的解析结果并将其转换回 JSON 并记录。
如果您能提供一些关于您要解决的问题的详细信息,我或许可以为您提供更多帮助。正如Maudicus所说,请注意您返回的错误。当我们对 API 进行更改时,您不希望您的应用中断。
【讨论】:
好的,我会看看 JSONKit,我基本上是在尝试获取foursquare api为我的应用返回的附近地点的列表。 现在我正在使用 JSONKit,但很难弄清楚返回的 json 的结构。 NSDictionary *json_obj = [jsonString objectFromJSONString]; NSArray *results = [json_obj objectForKey:@"places"];如何从此 json 中获取地点的名称。 就像 anoopr 所说,您应该确保使用 v= 参数,以便获得当前的场所 API。完成并将其传递给 JSONKit 后,您应该能够获得具有以下内容的场所数组: NSArray *venuesData = [[json_obj objectForKey:@"response"] objectForKey:@"venues"];【参考方案2】:如果NSLog(@"%@", results);
下面的输出是你的日志语句。看来您的结果变量是一个字典对象数组。
尝试记录类结果以验证NSLog(@"%@", [results class]);
如果它是一个数组,则您的组对象是第二个对象。
if ([results count] > 1)
id groups = [results objectAtIndex:1];
NSLog(@"groups class %@\ngroups %@", [groups class], groups);
继续这样做,直到您了解数据的格式
也行
errorDetail = "This endpoint will stop returning groups in the future. Please use a current version, see http://bit.ly/lZx3NU.";
应该引起关注。查看foursquare上的文档了解当前获取组的方式。
【讨论】:
我会试试这个并将结果发回。以上是关于解析foursquare为iPhone返回的json给出了无法识别的主角的主要内容,如果未能解决你的问题,请参考以下文章