解析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给出了无法识别的主角的主要内容,如果未能解决你的问题,请参考以下文章

为Leaflet解析Foursquare API JSON

适用于 iPhone 的 FourSquare API

Foursquare iPhone API 附近的地方

Foursquare 签到通过本机应用程序没有帐户

如何对foursquare场所/搜索api返回的结果进行分页?

Foursquare 场地“照片”请求返回 null