Objective-c中的NSTaggedPointerString objectForKey

问题描述 投票:0回答:5

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

任何帮助将不胜感激。

ios objective-c json nsjsonserialization
5个回答
9
投票

根据JSON的定义,每个JSON包含一个对象(可以是包含其他对象的集合类型)。在您的情况下,您的文本以“{”开头,因此这是一本字典。一本字典。

所以NSJSONSerialization,当它读取该文件时,会返回一个NSDictionary,其中包含IsExternal,FirstName等键下的值。

但是,您的代码在该字典上使用for( ... in ... )(根据NSDictionary文档,它将遍历字典中的键,这是字符串),但是然后您将这些字符串视为再次是字典。

所以不要循环遍历字典,你应该直接使用jsonObjects中的字典,通过调用-objectForKey:之类的东西。


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]);
 }

1
投票

你应该打电话

[jsonObjects objectForKey:@"FirstName"];

获取FirstName值。

下面的代码行返回(可能)一个NSDictionary,因此这是存储所有json值的容器。

id jsonObjects = [NSJSONSerialization JSONObjectWithData:
              mutableData options:NSJSONReadingMutableContainers error:nil];

0
投票

试试这段代码:

if ([jsonObjects isKindOfClass:[NSDictionary class]]) {
    NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
}

因为你的'jsonObjects'是通用类型'id'所以只要检查它是否是NSDictionary类型然后在if-block中你可以通过objectForKey直接访问它:


-2
投票

试试这段代码,希望对你有所帮助,

   id jsonObjects = [NSJSONSerialization JSONObjectWithData:
                      mutableData options:NSJSONReadingMutableContainers error:nil];
    if([jsonObjects respondsToSelector:@selector(objectForKey:)]){
         NSString *firstname = [jsonObjects objectForKey:@"FirstName"];
    }
© www.soinside.com 2019 - 2024. All rights reserved.