AFNewtorking 中的 JSON 序列化失败
Posted
技术标签:
【中文标题】AFNewtorking 中的 JSON 序列化失败【英文标题】:JSON serialisation in AFNewtorking is failing 【发布时间】:2014-06-22 18:05:33 【问题描述】:我正在尝试使用 AFNetworking 执行从 Web 服务返回 JSON 字符串的 GET 请求,但我从 AFNetworking 1.3.3 收到以下错误
@"JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。"
这是我的 JSON,它是一个有效的 JSON 字符串,我使用了许多在线验证器来确保
"\"ErrorCode\":0,\"VerCode\":\"8595\""
AFNetworking 代码不起作用
NSString *urlString = [BASE_URL stringByAppendingString:paramseters];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
path:urlString
parameters:nil];
AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
NSDictionary *jsonDic = (NSDictionary *)JSON;
success(jsonDic);
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
CPError *cpError = [CPError CPErrorWithErrorCode:error.code errorDesc:error.localizedDescription];
failure(cpError);
];
[operation start];
我能够使用以下代码将 JSON 解析为 NSDictionary,但我希望能够使用 AFNetworking 以利用它的内置功能,有没有办法让 AFNetworking 理解我的 JSON 字符串?
NSURL *url = [NSURL URLWithString:@"http://103.1.173.60/ims-mobile-wcf/MobileWCF.svc/AddUpdateMobileClient/123123/443da4444/1/1"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:120];
[request setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
NSLog(@"%@",connectionError);
NSError *error = nil;
NSString *JSONString = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSDictionary *JSONDictionary =
[NSJSONSerialization JSONObjectWithData: [JSONString dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
];
【问题讨论】:
发布失败的代码,而不是其他有效的代码。使用 AFNetworking 检查 JSON 的要求。 就我个人而言,我会打破Charles Proxy 并确保发送什么以及返回什么。 (免费试用)。 @Zaph 我发布的代码指出问题不在于服务器响应,实际上是 AFNetworking 【参考方案1】:我会试一试,说原因是响应字符串出现在引号中,如果是这种情况,那么错误非常明显 - 未设置 Fragments 选项。对“JSONReadingOptions”进行全局搜索,您会在 AFNetworking 中找到将响应序列化为基础对象的位置(在 1.3 版中,它是 AFJsonRequestOperation 第 79 行,看起来您使用的是 2.0)基本上正是您手动执行的操作.如果您按照 arturdev 的建议进行操作并将阅读选项设置为 NSJSONReadingAllowFragments 它应该可以工作。
【讨论】:
【参考方案2】:试试:
AFJSONRequestOperation *操作 = ... operation.JSONReadingOptions = NSJSONReadingAllowFragments; [操作开始];【讨论】:
为什么这被否决了?这是正确的答案。 非常感谢我从 AFNetowrking 获得了成功,但返回的对象是 JSON 字符串而不是 NSDictionry,因此我必须使用 NSDictionary *JSONDic = [NSJSONSerialization JSONObjectWithData: [jsonString dataUsingEncoding: NSUTF8StringEncoding] 选项:NSJSONReadingMutableContainers 错误:&error]; 我认为你的服务器有这个问题。如果使用默认配置的 AFNetworking 响应没有返回成功,那么我猜服务器没有返回 application/json 内容类型。所以最好让你的服务器开发人员检查一下。 否决票是因为您所做的一切就是让他将引用的 JSON 作为 NSString 读取。它不会导致解析的 JSON。【参考方案3】:这是错误的:
NSError *error = nil;
NSString *JSONString = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSDictionary *JSONDictionary =
[NSJSONSerialization JSONObjectWithData: [JSONString dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
JSONObjectWithData:
不返回 NSString
,它返回一个对象:NSArray
或 NSDictionary
,在您的情况下为 NSDictionary
只需使用:
NSError *error = nil;
NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
【讨论】:
以上是关于AFNewtorking 中的 JSON 序列化失败的主要内容,如果未能解决你的问题,请参考以下文章
CondaHTTPError:URL <https://repo.continuum.io/pk gs/r/win-64/repodata.json.bz2> 的 HTTP 000 连接失