Objective c 有效的JSON,但';可可错误3840';来自AFNetworking/NSJSONSerialization

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"

我已经花了好几个小时试图解决这个问题,但毫无结果——看来我唯一的选择就是在这里发帖,看看是否有人能对这个问题有所帮助。这可能是AFN网络的问题,或者(更可能)是我的代码的问题

我使用的代码在我的应用程序中99%的操作中都能完美地工作。我正在开发一个应用程序,通过构建JSON搜索、发送搜索结果并从服务器接收响应来利用弹性搜索

以下是返回的JSON示例:

{
    "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
给出(在我的测试中)一个NSDecimalNumber
0.0012
给出一个包含双精度字符的NSNumber。并且
4.439049394553e-312
仍然失败。(测试在iOS7模拟器中完成。)是的,在这里寻找一种方法来规避这个问题。这个问题显然在iOS11之后得到了解决。iOS 10仍将崩溃。