这是我的代码:
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:。
我在哪里做错了?
答案 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个错误会导致您的应用崩溃。