在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值

Posted

技术标签:

【中文标题】在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值【英文标题】:Reading key value of NSDictionary set with NSJSONSerialization of JSON data in Objective-C 【发布时间】:2017-04-25 10:04:36 【问题描述】:

所以我向我们的服务器发出了一个简单的 GET 请求,我得到的响应代码如下:

[[[NSURLSession sharedSession] dataTaskWithRequest:request
                                     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
      
          NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
          NSLog(@"dataString: %@", dataString);

          NSData *jsonData = [dataString dataUsingEncoding:NSUTF8StringEncoding];
          NSDictionary *jsonContent = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

          NSNumber * success = (NSNumber *)[jsonContent objectForKey: @"user_records_exist"];
          if([success boolValue] == YES)
          
              NSLog(@"true");
              NSLog(@"success: %d", [success boolValue]);
           else 
              NSLog(@"false");
              NSLog(@"failure: %d", [success boolValue]);
          
      ] resume];

而我得到的日志如下:

dataString: "\"user_records_exist\": true"

false
failure: 0

我不确定我做错了什么。如何获取"user_records_exist" 键的值?

谢谢

【问题讨论】:

试试这个[NSString stringWithFormat:@"%@",[jsonResponse objectforKey:@"user_records_exist"]]; if([success boolValue] == YES) 为什么要进行显式相等检查?只需写“if([success boolValue])” 【参考方案1】:

删除此代码:

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"dataString: %@", dataString);

NSData *jsonData = [dataString dataUsingEncoding:NSUTF8StringEncoding];

从原始数据中获取响应字典:

[[[NSURLSession sharedSession] dataTaskWithRequest:request
                                     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
      
          NSDictionary *jsonContent = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

          BOOL success = [[jsonContent objectForKey: @"user_records_exist"] boolValue];
          if(success)
          
              NSLog(@"true");
              NSLog(@"success: %d", success);
           else 
              NSLog(@"false");
              NSLog(@"failure: %d", success);
          
      ] resume];

【讨论】:

当我尝试您的解决方案时,NSLog(@"jsonResponse: %@", jsonResponse); 的日志变为 (null)【参考方案2】:

该错误清楚地表明您正在尝试获取字符串而不是字典的 objectforkey。

    NSDictionary *jsonContent = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

【讨论】:

问题不在Serialization 不要这样做,因为它只是隐藏了你原来的错误——你的数据给你的是一个字符串而不是字典【参考方案3】:

您假设的变量jsonResponse 是一个NSDictionary,实际上它是一个NSString。由于字符串不响应 valueForKey: 方法,您的应用程序崩溃了。这就是错误消息告诉您的内容。

【讨论】:

【参考方案4】:

--->dataString: "\"user_records_exist\": true"

它不是字典键,它是字符串请改进它的字典键格式你的服务器 api 否则你的应用程序将崩溃。制作字典键后,它将起作用,您可以像这样检查

id jsonResponse = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];

NSLog(@"jsonResponse: %@", jsonResponse);

If( [jsonResponse isKindOfClass:[NSDictionary class]] )


 Bool userRecord =  [[jsonResponse objectForKey:@"user_records_exist"]boolValue];

【讨论】:

以上是关于在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值

使用 Objective-C 到 UITableView 的 JSON 数据

编码 ™ £ 用于 JSON - 使用objective-c

在objective-c中有效解析单元素JSON

ios使用objective-c保存带有GET请求的json

如何使用 SBJson 和 Objective-C 解析和提取嵌套的 JSON 响应