Парсинг JSON, возвращенный Foursquare для iPhone, дает Нераспознанного главного героя - PullRequest
4 голосов
/ 05 ноября 2011

Я пытаюсь найти ближайшие места, используя API-интерфейс foursquare. Вот данные 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)

Как мне разобрать это?

Edit: Я попробовал предложенную технику, это дает мне массив

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 = Brooklyn;
                    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.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Я лидер по айфонам на foursquare. Я постараюсь нанести удар о том, что здесь происходит.

Прежде всего, я настоятельно рекомендую вам использовать JSONKit для вашего парсера. Это легкий и безумно быстрый: https://github.com/johnezang/JSONKit

Похоже, что вы правильно анализируете JSON и правильно получаете словарь. Затем вы регистрируете проанализированный объект, а не исходный JSON. Вывод, который вы видите, - это то, как Objective-C выбирает сериализовать проанализированный словарь в текст. Это определенно не JSON. Используя JSONKit, вы можете отправить селектор JSONString в ваш проанализированный результат, преобразовать его обратно в JSON и записать это.

Если бы вы могли предоставить некоторые подробности о проблеме, которую вы пытаетесь решить, я мог бы помочь вам больше. И как сказала Модик, пожалуйста, обратите внимание на ошибку, которую вы получаете. Вы не хотите, чтобы ваше приложение ломалось, когда мы вносим изменения в API.

1 голос
/ 05 ноября 2011

Если вывод ниже 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 для текущего способа получения групп.

...