使用 NSJSON 序列化 JSON 数据 Objective-C 读取 NSDictionary 集的键值
Reading key value of NSDictionary set with NSJSONSerialization of JSON data in Objective-C
所以我向我们的服务器发出了一个简单的 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 *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];
该错误清楚地表明您正在尝试获取字符串而不是字典的 objectforkey。
NSDictionary *jsonContent = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
--->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];
}
你假设的变量jsonResponse
是一个NSDictionary,实际上它是一个NSString。由于字符串不响应 valueForKey: 方法,您的应用程序崩溃了。这就是错误消息告诉您的内容。
所以我向我们的服务器发出了一个简单的 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 *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];
该错误清楚地表明您正在尝试获取字符串而不是字典的 objectforkey。
NSDictionary *jsonContent = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
--->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];
}
你假设的变量jsonResponse
是一个NSDictionary,实际上它是一个NSString。由于字符串不响应 valueForKey: 方法,您的应用程序崩溃了。这就是错误消息告诉您的内容。