NSDictionary objectForKey выдает исключение NSCFString - PullRequest
1 голос
/ 22 октября 2011

Это мой код:

    NSError *error = nil;
    SBJsonParser *parserJson = [[SBJsonParser alloc] init];
    NSDictionary *jsonObject = [parserJson objectWithString:webServiceResponse error:&error]; 
    [parserJson release], parserJson = nil;

    //Test to see if response is different from nil, if is so the parsing is ok
    if(jsonObject != nil){
        //Get user object
        NSDictionary *userJson = [jsonObject objectForKey:@"LoginPOST2Result"];
        if(userJson != nil){
            self.utente = [[User alloc] init];
            self.utente.userId = [userJson objectForKey:@"ID"];
        }

Пока строка Json webServiceResponse равна:

{"LoginPOST2Result":
    "{\"ID\":1,
    \"Username\":\"Pippo\",
    \"Password\":\"Pippo\",
    \"Cognome\":\"Cognome1\",
    \"Nome\":\"Nome1\",
    \"Telefono\":\"012345678\",
    \"Email\":null,
    \"BackOffice\":true,
    \"BordoMacchina\":false,
    \"Annullato\":false,
    \"Badge\":1234}"
}

Проблема возникает при выполнении этой строки:

self.utente.userId = (NSInteger *) [userJson objectForKey:@"ID"];

и ошибка:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectForKey:]: unrecognized selector sent to instance 0x6861520'

Ошибка, по-видимому, связана с тем, что объект userJson не является NSDictionary, а скорее тип NSCFString и, следовательно, не отвечает на сообщение objectForKey:.
Гдея делаю не так?

Ответы [ 2 ]

2 голосов
/ 22 октября 2011

Проблема в том, что хотя значение в ответе json для ключа "LoginPOST2Result" выглядит как словарь, на самом деле это строка, заключенная в кавычки.

Итак, вы отправляете сообщение objectForKey: в NSString, а не в NSDictionary. NSString не отвечает на objectForKey:.

Похоже, что webServiceResponse генерируется неправильно или анализируется неправильно.

1 голос
/ 22 октября 2011

Вам нужно лучше понять, что такое указатель, а что нет в Cocoa Framework.

Фактически вы определяете userJson для NSDictionary, а не NSDictionary *. Учтите, что все объекты в Какао являются указателями. Фактически проверьте, что [NSDictionary objectForKey:] возвращает «id», а затем вы должны использовать NSDictionary *. Используя просто NSDictionary, вы будете ссылаться на класс.

Аналогичная ошибка была сделана позже в приведении к (NSInteger *), но NSInteger (NSInteger не является объектом, это базовый тип, который колеблется от long или int (зависит от архитектуры платформы), как вы можете видеть из его определения:


#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

А также из определения объекта выше видно, что ключ, который вы пытаетесь получить, сбрасывается в виде строки, и вы пытаетесь получить словарь. Пожалуйста, проверьте оригинальный JSON, который, вероятно, не в том формате, который вы ожидаете.

Таким образом, в конце у вас будет как минимум 3 ошибки, которые приведут к падению вашего приложения.

...