对于来自Venue搜索端点的接收数据,NSJSONSerialization isValidJSONObject返回false

时间:2016-11-16 15:30:52

标签: ios foursquare

Xcode 8.1部署目标iOS 9.0

我正在获得一系列紧凑的场地对象,正如预期的Foursquare Venue Search端点......

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data

当我使用...

检查数据对象时
if ([NSJSONSerialization isValidJSONObject:data])

我得到了一个错误。

有人可以告诉我这里有什么问题吗?

编辑: 这是完整的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);
}

之前的代码没有if块。只是...

id foundationObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

当我意识到(在上述语句之后使用断点) foundationObject 为零时,即使 data 不是

,也会进行更改。

注意:这在我3月份发布iOS 9.x应用程序之前就运行良好。可以调用Venue Endpoint的版本有所作为吗?

2 个答案:

答案 0 :(得分:3)

您在这里测试的是NSData。 isValidJSONObject的输入为id而不是NSData

+ (BOOL)isValidJSONObject:(id)obj;

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

另外,根据文件,

  

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

     
      
  1. 顶级对象是NSArray或NSDictionary。
  2.   
  3. 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
  4.   
  5. 所有字典键都是NSString的实例。
  6.   
  7. 数字不是NaN或无穷大。
  8.         

    调用isValidJSONObject:或尝试转换是判断给定对象是否可以转换为JSON数据的明确方法。

要将NSData转换为JSONObject,您可以使用以下代码

NSError *error;
id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (!error) {
    // successfully done.
}else {
   NSLog(@"error: %@", error.localizedDescription)
}

请注意,要找出您从服务器接收的jsonData(NSData)有什么问题,您必须将NSError对象传递给方法,如上面的代码所示。如果将NSData转换为jsonObject失败,您可以根据它找出原因。

有关在Objective-C中使用NSError个对象的更多信息,请查看此link

答案 1 :(得分:3)

您在这里使用了错误的方法isValidJSONObject将告诉您JSON对象(id)是否将转换为JSON数据。

根据doc

  

返回一个布尔值,指示给定对象是否可以   转换为JSON数据。        如果obj可以转换为JSON数据,则为YES,否则为NO。

如果您想查看数据,那么您应该使用JSONObjectWithData:options:error:并检查它是否为零。

修改

您需要先将数据转换为NSDictionaryNSArray,如此

NSMutableDictionary * dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

然后检查dict是否是一个有效的儿子,或者不是这样的

if([NSJSONSerialization isValidJSONObject:dict]){
    NSLog(@"dict is a valid JSON");
}else{
    NSLog(@"dict is not valid JSON");
}