检查 JSON 键是否存在

Checking if JSON key is present

场景是这样的;我收到来自 API 的 JSON 回复。我从 API 获得如下回复:

[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://apitest.maranatha.org/api/SiteGroupStagings?countryId=%i",[country getCountryID]]]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:token forHTTPHeaderField:@"Token"];


NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];

if (returnData) {
    NSDictionary* jsonResponse = [NSJSONSerialization
                                  JSONObjectWithData:returnData                                     options:NSJSONReadingMutableContainers
                                  error:&error];
}

当 API 调用正确时,API 将 return 一个 JSON 对象数组,return 如下所示:

[
 {},
 {},
 ...
]

如果在服务器端处理请求时出现任何问题(除了客户端缺少互联网连接),API 的响应如下:

{
 "message": "In lorem ipsum"
}    

我想检查 key/value 对是否存在,以便能够提醒用户,而不是尝试处理会导致异常发生的响应。 我尝试了以下方法,但它似乎不起作用,它似乎总能找到一个消息键,即使 JSON 响应是一个对象数组。

if ([jsonResponse valueForKey:@"message"]) {
        NSLog(@"%@", [jsonResponse valueForKey:@"message"]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:[jsonResponse valueForKey:@"message"]
                                                       delegate:self
                                              cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];


    }
    else {
     //consume the JSON response
    }

如何才能成功检查来自 API 的响应是否包含消息 key/value 对?

听起来您的服务器 API returns JSON 实体也具有用于成功请求的键 "message",对吗?如果是这样,也许试试这个:

if (jsonResponse[@"message"] &&
    [jsonResponse[@"message"] isKindOfClass:[NSString class]] &&
    [jsonResponse[@"message"] isEqualToString:@"In lorem ipsum"])
{
    // Alert
}

这应该可以更好地(但不一定完全)防止整个 JSON 实体内容的运行时差异。

感谢@fullofsquirrels,我知道了如何解决这个问题。

如果 JSON 是一个 JSON 数组,[NSJSONSerialization] 将使它成为一个 NSArray,所以最简单的方法是检查我的响应是否是一个数组,或者如果不是。这是我的解决方案。

if (![jsonResponse isKindOfClass:[NSArray class]]) {
        NSLog(@"%@", [jsonResponse valueForKey:@"message"]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:[jsonResponse valueForKey:@"message"]
                                                       delegate:self
                                              cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];


    }
else {
      //consume API
}