NSJSONSerialization isValidJSONObject 对于从场所搜索端点接收到的数据返回 false

Ace*_*ceN 2 foursquare ios

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 的应用程序时,此功能运行得很好。被调用的场地端点的版本会产生影响吗?

Kri*_*aCA 6

您在这里测试的是 NSData。的输入isValidJSONObject不是idNSData

+ (BOOL)isValidJSONObject:(id)obj;
Run Code Online (Sandbox Code Playgroud)

YES如果 obj 可以转换为 JSON 数据,则返回( NSData),否则返回 NO。

另外,根据文档,

可以转换为 JSON 的对象必须具有以下属性:

  1. 顶级对象是 NSArray 或 NSDictionary。
  2. 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。
  3. 所有字典键都是 NSString 的实例。
  4. 数字不是 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 中使用对象的更多信息