Objective c 有效的JSON,但';可可错误3840';来自AFNetworking/NSJSONSerialization
我已经花了好几个小时试图解决这个问题,但毫无结果——看来我唯一的选择就是在这里发帖,看看是否有人能对这个问题有所帮助。这可能是AFN网络的问题,或者(更可能)是我的代码的问题 我使用的代码在我的应用程序中99%的操作中都能完美地工作。我正在开发一个应用程序,通过构建JSON搜索、发送搜索结果并从服务器接收响应来利用弹性搜索 以下是返回的JSON示例:Objective c 有效的JSON,但';可可错误3840';来自AFNetworking/NSJSONSerialization,objective-c,json,cocoa,afnetworking,nsjsonserialization,Objective C,Json,Cocoa,Afnetworking,Nsjsonserialization,我已经花了好几个小时试图解决这个问题,但毫无结果——看来我唯一的选择就是在这里发帖,看看是否有人能对这个问题有所帮助。这可能是AFN网络的问题,或者(更可能)是我的代码的问题 我使用的代码在我的应用程序中99%的操作中都能完美地工作。我正在开发一个应用程序,通过构建JSON搜索、发送搜索结果并从服务器接收响应来利用弹性搜索 以下是返回的JSON示例: { "took": 4, "timed_out": false, "_shards": { "total"
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": null,
"hits": [
{
"_index": "asx",
"_type": "61a88d3848b00655d9aa59db70847318",
"_id": "b91f9257744fedb4ef1c127e275c127c",
"_score": null,
"_source": {
"value": "22/06/1998"
},
"sort": [
4.439049394553e-312
]
}
]
}
}
现在,将其插入jsonlint.com(并了解一些JSON格式),很容易看出这是有效的JSON
我正在使用AFHTTPClient子类来发布请求和接收数据。以下是我用来发布的代码:
[super postPath:path parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
NSData *responseData = [(AFJSONRequestOperation *)operation responseData];
NSDictionary *responseDictionary;
if (responseData != nil) {
responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:NULL];
}
if (success) {
success(operation, responseDictionary);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSData *responseData = [(AFJSONRequestOperation *)operation responseData];
NSDictionary *responseDictionary;
if (responseData != nil) {
responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:NULL];
}
if (failure) {
failure(operation, error, responseDictionary);
}
}];
这里没有什么特别之处,我只是将响应转换成一些JSON
然而,问题是,对于这个特定的请求,AFNetworking将响应视为失败,因此失败块中的代码是唯一正在执行的代码。我得到以下错误:
(lldb) po error
$1 = 0x0adbc710 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Number wound up as NaN around character 279.) UserInfo=0xad968d0 {NSDebugDescription=Number wound up as NaN around character 279.}
JSON中包含一个指数数字(特别是4.439049394553e-312),但这是一个有效数字,应该能够被解析。当我尝试使用NSJSONSerialization解析响应数据时,我得到了相同的NSError。只是澄清一下——AFNetworking给我的错误消息与NSJSONSerialization一样
我找不到其他人和我有同样的问题,也不明白为什么我的JSON不能被解析。它让我的应用程序留下了一个我无法修复的非常大的错误
如果有人能对这个问题有所了解,那就太好了。如果这不是AFNetworking的问题,如果你能给我指一个有用的资源,那也会很棒。当然,如果你需要更多的信息,请询问
谢谢。
NSJSONSerialization
使用NSDecimalNumber
表示数字,以及
[NSDecimalNumber decimalNumberWithString:@"4.439049394553e-312"]
已返回NaN
,因为NSDecimalNumber
只能表示数字
mantissa x 10^exponent where `-128 <= exponent <= 127`.
尾数x 10^指数,其中`-128我想你已经知道了。我们被限制在可以解码的数据范围内,这有点愚蠢。我原以为它们会包含某种JSON解析选项,比如说,如果不能将它们解析为数字,就将它们解析为字符串。类似于有损转换为NSData的方式。不,NSJSONSerialization使用NSNumber和整数值小于10^18的整数值,NSDecimalNumber和整数值大于等于10^18的整数值,NSNumber和双数值表示所有具有小数点或指数的值。@gnasher729:您是对的,在某些情况下使用NSNumber,不是小数。(在这里冗长的讨论中,我也注意到了这一点)。但你似乎并不完全正确1.2e-3
给出(在我的测试中)一个NSDecimalNumber0.0012
给出一个包含双精度字符的NSNumber。并且4.439049394553e-312
仍然失败。(测试在iOS7模拟器中完成。)是的,在这里寻找一种方法来规避这个问题。这个问题显然在iOS11之后得到了解决。iOS 10仍将崩溃。