EXC_BAD_ACCESS во время синтаксического анализа JSON с использованием SBJSON.Соответствующая переменная состояний сообщения json_string не является CFString - PullRequest
1 голос
/ 01 ноября 2011

У меня есть следующий ответ со стороны сервера:

{"_playLists":[{"name":"Playlist 1","items":[{"name":"Poza 1","target":"http:\/\/myaudi.fr","url":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/image\/pic1_iphone3.jpg","url_thumb":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/thumb\/pic1_iphone3_thumb.jpg"},{"name":"Poza 2","target":"http:\/\/audifrance.fr","url":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/image\/pic2_iphone3.jpg","url_thumb":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/thumb\/pic2_iphone3_thumb.jpg"}]},{"name":"Playlist 2","items":[{"name":"Poza 3","target":"http:\/\/google.ro","url":null,"url_thumb":null}]}]}

И я пытаюсь получить доступ к этому с помощью:

SBJSON *parser = [[SBJSON alloc] init];
NSString *responseString = [request responseString];

NSString *json_string = [[NSString alloc] initWithData:responseString encoding:NSUTF8StringEncoding];
NSArray *statuses = [parser objectWithString:json_string error:nil];

Но я получаю EXC_BAD_ACCESS в этой строке

 NSString *json_string = [[NSString alloc] initWithData:responseString encoding:NSUTF8StringEncoding]; 

говоря, что переменная json_string не является CFString.

Может кто-нибудь помочь мне решить эту проблему и подсказать, как действовать дальше для доступа к компонентам JSON? Спасибо :)

РЕДАКТИРОВАТЬ:

{
        items =         (
                        {
                name = "Poza 1";
                target = "http://myaudi.fr";
                url = "http://test.res-novae.fr/sfrplay/upload/image/pic1_iphone3.jpg";
                "url_thumb" = "http://test.res-novae.fr/sfrplay/upload/thumb/pic1_iphone3_thumb.jpg";
            },
                        {
                name = "Poza 2";
                target = "http://audifrance.fr";
                url = "http://test.res-novae.fr/sfrplay/upload/image/pic2_iphone3.jpg";
                "url_thumb" = "http://test.res-novae.fr/sfrplay/upload/thumb/pic2_iphone3_thumb.jpg";
            }
        );
        name = "Playlist 1";
    },
        {
        items =         (
                        {
                name = "Poza 3";
                target = "http://google.ro";
                url = "<null>";
                "url_thumb" = "<null>";
            }
        );
        name = "Playlist 2";
    }

Ответы [ 3 ]

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

Вы должны использовать одну из доступных JSON-инфраструктур, например, JSONKit или json-framework , которая позволяет действительно легко преобразовывать строки в объекты JSON (т. Е. NSDictionary).

Если вы используете json-framework, вам нужно будет только сделать следующее (если вы включили JSON.h):

NSDictionary *jsonObject = [responseString JSONValue];
0 голосов
/ 01 ноября 2011

Проблема с вашей линией

NSString *json_string = [[NSString alloc] initWithData:responseString encoding:NSUTF8StringEncoding];

вы объявили responseString как NSString *responseString = [request responseString]; и вы даете его как данные при выделении json_string

0 голосов
/ 01 ноября 2011

Вам не нужна эта строка

NSString *json_string = [[NSString alloc] initWithData:responseString encoding:NSUTF8StringEncoding];

responseString уже является строкой (и initWithData: ожидает объект NSData, а не NSString). Просто скорми его прямо парсеру:

NSArray *statuses = [parser objectWithString:responseString error:nil];

Может кто-нибудь помочь мне решить эту проблему и сказать, как действовать дальше, чтобы получить доступ компоненты JSON?

Теперь у вас есть хороший NSArray объектов NSDictionary, представляющих ваши данные JSON, вы можете получить доступ к первому элементу, представленному

{"name":"Playlist 1","items":[{"name":"Poza 1","target":"http:\/\/myaudi.fr","url":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/image\/pic1_iphone3.jpg","url_thumb":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/thumb\/pic1_iphone3_thumb.jpg"},{"name":"Poza 2","target":"http:\/\/audifrance.fr","url":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/image\/pic2_iphone3.jpg","url_thumb":"http:\/\/test.res-novae.fr\/sfrplay\/upload\/thumb\/pic2_iphone3_thumb.jpg"}]}

получая первый элемент в массиве

NSDictionary* dict = [statuses objectAtIndex:0];

и ключи в словаре должны быть «name» и «items». Объект для «имени» будет представлять собой NSString, а объект для «элементов» будет представлять собой NSArray, содержащий дополнительные объекты NSDictionary, описывающие каждый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...