【问题标题】:Convert NSData from NSURLSession to JSON将 NSData 从 NSURLSession 转换为 JSON
【发布时间】:2016-10-25 13:38:35
【问题描述】:

我知道有许多类似的 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) 结果。

【问题讨论】:

  • 你在 responseString 中得到了什么?
  • 你的 JSON 真的是顶级的 NSDictionary 吗?使用error 参数怎么样?
  • NSData 转换为NSString 并直接转换回NSData 非常愚蠢。根据您的代码datajsonData 是相同的
  • @vadian 知道这一点,但想看看字符串的输出是什么。
  • 但无论如何,将其转换回来的额外步骤是多余的。您确定 JSON 的根对象是字典吗?并处理错误。

标签: objective-c json nsurlsession


【解决方案1】:

您的主要问题:
如果你阅读+JSONObjectWithData:options:error:的错误参数,它会告诉你:

Error Domain=NSCocoaErrorDomain Code=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,所以理论上,没有什么可以捕捉到的,但它可能仍然不起作用(因为有一个 @ 987654328@)。 当然,由于data 参数应该是非空的,如果它是nil,你会得到一个NSException(它会记录Exception caught data parameter is nil),但这是另一个问题,并不能保证你解析成功如果没有异常,则错误(因为在我们的例子中是无效的 JSON)。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • @MinkleGrag 仍然为空,没有抛出异常 - 请参阅更新的问题以了解我如何放置它
    • NSData 也为零?
    • 我不相信,它创建了我之前提到的responseString,证明是好的JSON
    • 向我展示您在 Responsestring 中获得的内容。由于您提供的此链接没有显示任何内容jsonviewer.stack.hu
    • 该链接允许您检查文本,将其视为 JSON。如果它不能转换为 JSON,链接会告诉你,但我也会在问题中攻击字符串
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多