使用 AFNetworking 解析 JSON 文件

Posted

技术标签:

【中文标题】使用 AFNetworking 解析 JSON 文件【英文标题】:Parse JSON file using AFNetworking 【发布时间】:2015-07-27 09:06:14 【问题描述】:

我有一个包含 json 文件的链接。我的意思是,如果我在 chrome 中启动该链接,则会在我的计算机上下载一个扩展名为 .json 的文件。 说链接是www.foffa.com/sampleList.json 我是 AFNetworking 的新手,不确定如何解析这个 json,无论是否必须将此文件写入磁盘。

我的代码如下所示,我很确定我必须使用流和所有这些,但我不确定如何。截至目前我收到一个错误"Request failed: unacceptable content-type: text/plain" 我猜它期望内容类型为"Content-Type" = "application/octet-stream";

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFHTTPResponseSerializer serializer];
    operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/octet-stream"];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
             NSLog(@"Data retrived");       
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];
    ];

【问题讨论】:

您回复的内容类型似乎设置为text/plain。您需要将其从服务器端更改为您接受的服务器端,或者您需要添加 text/plain 作为可接受的内容类型。 【参考方案1】:

在此更改第二行:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFHTTPResponseSerializer serializer];

到这里:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];

请注意,您使用的是序列化的AFJSONResponseSerializer 响应。

更新

从以下 cmets 中的信息更新我的答案,看来您实际上想从服务器下载 JSON 文件然后解析它,而不是直接从 HTTP 响应解析 JSON:

为此,将内容类型更改为text/plain,并将下载的file/data 解析为StringJSON 对象,如下所示:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:nil];
operation.responseSerializer = [AFHTTPResponseSerializer serializer];
operation.responseSerializer.acceptableContentTypes =
    [NSSet setWithObjects:@"application/octet-stream", @"text/plain", nil];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
  NSError *error;
  id json = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];
  if (error) 
      NSLog(@"Error: %@", error);
   else 
      NSLog(@"JSON: %@", json);
  
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 

  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                      message:[error localizedDescription]
                                                     delegate:nil
                                            cancelButtonTitle:@"Ok"
                                            otherButtonTitles:nil];
  [alertView show];
];

【讨论】:

是的...我认为这里的想法是先下载文件然后解析它。可能是 afnetworking 无法即时完成 在测试 (404) 时我无法让该 url 工作,所以我用 http://ip.jsontest.com 进行了测试,上面的工作但你需要将预期类型更改为 application/json 而不是 application/octet-stream我会用http://ip.jsontest.com 或其他一些有效的JSON 响应与您所拥有的响应进行测试,因为URL 似乎正在强制下载该文件。 你能在objective-c中给出这个吗..我不熟悉swift。 除了可接受的内容类型中的 @"text/plain" 值外,我实际上在做同样的事情。你为什么认为它过去会失败..? @AnkitSrivastava AFNetworking 在它所期望的响应中非常特别。你说你期待一个 application/octet-stream 响应,但实际上得到一个 text/plain 响应,所以它抛出一个错误,说你得到了错误类型的数据。【参考方案2】:

AFNetwroking 不会为您解析收入数据。

使用 NSJSONSerialization 的类方法+JSONObjectWithData:options:error:。如果您的数据有效,结果将是与原始 JSON 文件结构相同的 NSDictionary

你应该把它放在成功块内

【讨论】:

以上是关于使用 AFNetworking 解析 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 解析 JSON

使用 AFNetworking 2.0 异常解析 JSON

使用 AFNetworking 将 JSON 解析为 NSDictionary

使用 AFNetworking 解析 JSON

在 iOS 5 中使用 AFNetworking 解析 JSON

iOS - AFNetworking 的 JSON 解析