使用 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
解析为 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];
}];
我有一个 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 文件
你应该把它放在成功块中
修改第二行:
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
解析为 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];
}];