Xcode 8.1 部署目标 iOS 9.0
我按照预期从 Foursquare 场地搜索端点获得了一系列紧凑的场地对象...
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
Run Code Online (Sandbox Code Playgroud)
当我使用...检查数据对象时
if ([NSJSONSerialization isValidJSONObject:data])
Run Code Online (Sandbox Code Playgroud)
我得到一个假的。
有人能告诉我这里出了什么问题吗?
编辑:这是完整的 if 块(在 if 块中向数据添加类型转换之后)...
id foundationObject;
NSLog(@"data:- %@",data);
if ([NSJSONSerialization isValidJSONObject:(id)data])
{
foundationObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"venues foundation object:- %@",foundationObject);
}
Run Code Online (Sandbox Code Playgroud)
之前的代码没有 if 块。只是...
id foundationObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
Run Code Online (Sandbox Code Playgroud)
当我意识到(在上述语句之后使用断点) foundationObject为零时,即使data不是,也进行了更改。
注意:当我在三月份发布适用于 iOS 9.x 的应用程序时,此功能运行得很好。被调用的场地端点的版本会产生影响吗?
您在这里测试的是 NSData。的输入isValidJSONObject不是idNSData
+ (BOOL)isValidJSONObject:(id)obj;
Run Code Online (Sandbox Code Playgroud)
YES如果 obj 可以转换为 JSON 数据,则返回( NSData),否则返回 NO。
另外,根据文档,
可以转换为 JSON 的对象必须具有以下属性:
- 顶级对象是 NSArray 或 NSDictionary。
- 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。
- 所有字典键都是 NSString 的实例。
- 数字不是 NaN 或无穷大。
调用 isValidJSONObject: 或尝试转换是判断给定对象是否可以转换为 JSON 数据的明确方法。
要转换NSData为 JSONObject,可以使用以下代码
NSError *error;
id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (!error) {
// successfully done.
}else {
NSLog(@"error: %@", error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)
请注意,要找出NSData从服务器接收的 jsonData( ) 有什么问题,您必须将NSError对象传递到方法中,如上面的代码所示。如果转成NSDatajsonObject失败,可以根据此查找原因。
请查看此链接NSError以获取有关在 Objective-C 中使用对象的更多信息