NSDictionary objectForKey抛出异常NSCFString

时间:2011-10-22 12:39:46

标签: objective-c nsdictionary sbjson

这是我的代码:

    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 个答案:

答案 0 :(得分:2)

问题在于,虽然键“LoginPOST2Result”的json响应中的值看起来像字典,但它实际上是一个字符串,因为它用引号括起来。

因此,您将objectForKey:消息发送到NSString而不是NSDictionary。 NSString不响应objectForKey:。

看起来webServiceResponse生成错误或解析不正确。

答案 1 :(得分:1)

你需要更好地理解什么是指针以及Cocoa框架中没有的东西。

事实上,您将userJson定义为NSDictionary而不是NSDictionary *。考虑Cocoa中的所有对象都是指针。事实上检查[NSDictionary objectForKey:]返回“id”然后你必须使用NSDictionary *。使用简单的NSDictionary,您将引用该类。

类似的错误后来在强制转换为(NSInteger *)但NSInteger(NSInteger不是一个对象,它是一个从long或int犹豫不决的基本类型(取决于平台架构),你可以从它的定义中看到:< / p>


#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个错误会导致您的应用崩溃。