将NSData从NSURLSession转换为JSON

huddie96

我知道有很多类似的SO问题与我的标题相似。我已经检查了它们,但仍然遇到此问题。

我正在尝试访问一个API,该API返回应该/应该格式化为JSON的字符串。

要检索此字符串,并将其转换为JSON,我正在使用(未成功)此代码:

NSError *error;

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {

                                NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                                      NSLog(@"Response: %@",responseString);


                                      NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];

                                      id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];

                                      NSLog(@"%@",[json objectForKey:@"ID"]);


                                      NSLog(@"Json: %@",json);

                                  }];



    [task resume];

NSLog(@“ Response:...)返回一个字符串,当我将其输入此网站时:http : //jsonviewer.stack.hu确认该字符串是有效的JSON。

应该返回JSON值的两个NSLog都返回null。

我尝试过的是:

  • NSDictionary * json = [NSJSONSerialization JSONObjectWithData:jsonData选项:NSJSONReadingMutableContainers错误:&error];

  • NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data选项:NSJSONReadingMutableContainers错误:&error];

我现在也尝试过:

 NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {


                                      NSMutableDictionary *jsonObject;

                                      NSError *err = nil;
                                      @try
                                      {
                                          jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];
                                      }
                                      @catch (NSException *exception)
                                      {
                                          NSLog( @"Exception caught %@",exception);
                                      }

                                      NSDictionary *info = jsonObject;

                                      NSLog(@"Json: %@",info);

                                  }];



    [task resume];

我在这里做错了什么?如何获得NSDictionary(JSON)结果。

眼泪

您的主要问题:
如果您读取的错误参数+JSONObjectWithData:options:error:,它将告诉您以下信息:

错误域= NSCocoaErrorDomain代码= 3840“ JSON文本不是以数组或对象开头,并且没有允许设置片段的选项。” UserInfo = {NSDebugDescription = JSON文本不是以数组或对象开头,并且未设置允许片段的选项。}

如前所述,您的答案看起来像这样:aStringKey = realAndValidJSONSurroundedByCurvyBrackets,这不是有效的JSON。在聊天中讨论之后,您已与服务器端联系,提供适当的JSON应该是他们的责任。在他们修复它之前,为了保持工作状态,您可以执行以下操作:

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
str = [str stringByReplacingCharactersInRange:NSMakeRange(0, [@"aStringKey = " length] ) withString:@""];
NSError *jsonError = nil;
NSDictionary *jsonFinal = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&jsonError];

if (jsonError)
{
    NSLog(@"Error: %@", jsonError);
}

但是请记住,这是“快速破解/修复”,不应保留在最终版本中并尽快删除。

您尝试过:

NSError *err = nil;
@try
{
    jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];
}
@catch (NSException *exception)
{
    NSLog( @"Exception caught %@",exception);
}

@try{}@catch(NSException *exception)不应该因为工作+JSONObjectWithData:options:error:不应该扔NSException在你的情况,因此从理论上讲,没有什么可抓,并但它可能仍然无法工作(因为有NSError)。当然,由于data参数应该为非null,如果为,则将nil得到一个NSException(将记录Exception caught data parameter is nil),但这是另一个问题,并且不能向您保证解析出错(因为像我们这样的JSON无效),如果也不例外。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章