在 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