使用 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: 方法,您的应用程序崩溃了。这就是错误消息告诉您的内容。