使用 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
解析为String
或JSON
对象,如下所示:
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 解析为 NSDictionary