当我尝试从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
}
任何帮助将不胜感激。
答案 0 :(得分:9)
根据JSON的定义,每个JSON包含一个对象(可以是包含其他对象的集合类型)。在您的情况下,您的文字以" {"开头,因此这是一本字典。 单字典。
所以NSJSONSerialization
,当它读取该文件时,会返回一个NSDictionary
,其中包含IsExternal,FirstName等键下的值。
但是,您的代码在该字典上使用for( ... in ... )
(根据NSDictionary
文档,它将遍历字典中的键,即字符串),但之后您将这些字符串视为他们又是字典。
因此,您应该直接在jsonObjects
上使用字典,而不是在字典上循环,通过在其上调用类似-objectForKey:
的内容。
答案 1 :(得分:3)
有一个误解:
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]);
}
答案 2 :(得分:1)
你应该致电
[jsonObjects objectForKey:@"FirstName"];
获取FirstName值。
下面的代码行返回(可能)NSDictionary
,因此这是存储所有json值的容器。
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
mutableData options:NSJSONReadingMutableContainers error:nil];
答案 3 :(得分:0)
试试这段代码:
if ([jsonObjects isKindOfClass:[NSDictionary class]]) {
NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
}
因为'jsonObjects'是泛型类型'id'所以只需检查它是否是NSDictionary类型然后在if-block中你可以通过objectForKey直接访问它:
答案 4 :(得分:-2)
试试这段代码,希望有所帮助,
id jsonObjects = [NSJSONSerialization JSONObjectWithData:
mutableData options:NSJSONReadingMutableContainers error:nil];
if([jsonObjects respondsToSelector:@selector(objectForKey:)]){
NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
}