检查 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
}
场景是这样的;我收到来自 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
}