当我尝试从JSON结果中获取结果时。它抛出以下异常。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString objectForKey:]: unrecognized selector sent to instance 0xa006449656c6f526'
我的代码。
NSString *responseStringWithEncoded = [[NSString alloc] initWithData: mutableData encoding:NSUTF8StringEncoding];
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
mutableData options:NSJSONReadingMutableContainers error:nil];
for (NSDictionary *dataDict in jsonObjects) {
NSString *firstname = [dataDict objectForKey:@"FirstName"];
}
上面的代码抛出一个NSException
。
我的JSON响应看起来像这样。
{
"IsExternal": 0,
"LoginId": 4,
"EmployeeId": 223,
"FirstName": "GharValueCA",
"RoleId": 4,
"LastName": null,
"Mobile": null,
"AgencyId": 100,
"BranchId": 74
}
任何帮助将不胜感激。
根据JSON的定义,每个JSON包含一个对象(可以是包含其他对象的集合类型)。在您的情况下,您的文本以“{”开头,因此这是一本字典。一本字典。
所以NSJSONSerialization
,当它读取该文件时,会返回一个NSDictionary
,其中包含IsExternal,FirstName等键下的值。
但是,您的代码在该字典上使用for( ... in ... )
(根据NSDictionary
文档,它将遍历字典中的键,这是字符串),但是然后您将这些字符串视为再次是字典。
所以不要循环遍历字典,你应该直接使用jsonObjects
中的字典,通过调用-objectForKey:
之类的东西。
有一个误解:
jsonObjects
已经是字典,将反序列化的对象立即分配给dataDict
。
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:mutableData
options:0
error:nil];
// mutableContainers in not needed to read the JSON
枚举的对象是字符串,数字或<null>
。你在一个导致错误的字符串上调用了objectForKey:
。
直接获取名称(无循环)
NSString *firstname = dataDict[@"FirstName"];
或者你可以枚举字典
for (NSString *key in dataDict) {
NSLog(@"key:%@ - value:%@", key, dict[key]);
}
你应该打电话
[jsonObjects objectForKey:@"FirstName"];
获取FirstName值。
下面的代码行返回(可能)一个NSDictionary
,因此这是存储所有json值的容器。
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
mutableData options:NSJSONReadingMutableContainers error:nil];
试试这段代码:
if ([jsonObjects isKindOfClass:[NSDictionary class]]) {
NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
}
因为你的'jsonObjects'是通用类型'id'所以只要检查它是否是NSDictionary类型然后在if-block中你可以通过objectForKey直接访问它:
试试这段代码,希望对你有所帮助,
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
mutableData options:NSJSONReadingMutableContainers error:nil];
if([jsonObjects respondsToSelector:@selector(objectForKey:)]){
NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
}