Objective-c中的NSTaggedPointerString objectForKey

时间:2016-10-24 11:08:06

标签: ios objective-c json nsjsonserialization

当我尝试从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
}

任何帮助将不胜感激。

5 个答案:

答案 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"];
    }