使用 AFNetworking 解析 JSON 文件

Parse JSON file using AFNetworking

我有一个 link,其中包含一个 json 文件。我的意思是,如果我在 chrome 中启动 link,则会在我的计算机上下载一个扩展名为 .json 的文件。 说 link 是 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];
    }];

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

使用NSJSON序列化的class方法+JSONObjectWithData:options:error:。如果您的数据有效,结果将是与原始 JSON 文件

具有相同结构的 NSDictionary

你应该把它放在成功块中

修改第二行:

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

对此:

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

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

更新

根据以下评论中的信息更新我的答案,看来您实际上想从服务器下载 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];
}];