检查是否存在JSON密钥

时间:2016-03-08 22:03:48

标签: objective-c json ios8

这是场景;我有来自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将返回JSON对象数组,返回如下所示:

[
 {},
 {},
 ...
]

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

{
 "message": "In lorem ipsum"
}    

我想检查该键/值对是否存在,以便能够提醒用户,而不是尝试处理会导致异常发生的响应。 我尝试了以下方法,但它似乎无法工作,它似乎总能找到一个消息密钥,即使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的响应是否包含消息键/值对?

2 个答案:

答案 0 :(得分:0)

听起来您的服务器API返回带有密钥"消息"的JSON实体。对于成功的请求,对吗?如果是这种情况,可以试试这个:

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

这可以为您提供更好(但不一定完整)的保护,防止整个JSON实体内容的运行时差异。

答案 1 :(得分:0)

感谢@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
}