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,它返回一个对象:NSArrayNSDictionary,在您的情况下为 NSDictionary 只需使用:

NSError *error = nil;
NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

【讨论】:

以上是关于AFNewtorking 中的 JSON 序列化失败的主要内容,如果未能解决你的问题,请参考以下文章

Flink性能问题定位

CondaHTTPError:URL <https://repo.continuum.io/pk gs/r/win-64/repodata.json.bz2> 的 HTTP 000 连接失

JavaScript中的JSON序列化/反序列化

JSON中的反序列化和序列化是啥?

使用 json.net 中的属性序列化 DataSet/DataTable

将 jsonArrayAgg 合并为 jOOQ 中的空数组