这是场景;我有来自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的响应是否包含消息键/值对?
答案 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
}