2013-09-06 23 views
6

Tôi đã bỏ lỡ hàng giờ để giải quyết vấn đề này không có kết quả - có vẻ như tùy chọn duy nhất của tôi là đăng ở đây ánh sáng về vấn đề này. Nó có thể là một vấn đề với AFNetworking, hoặc (nhiều khả năng), nó có thể là một vấn đề với mã của tôi.JSON hợp lệ, nhưng 'Lỗi ca cao 3840' từ AFNetworking/NSJSONSerialization

Mã tôi đang sử dụng hoạt động hoàn hảo cho 99% hoạt động trong ứng dụng của tôi. Tôi đang phát triển một ứng dụng thúc đẩy Tìm kiếm Đàn hồi bằng cách xây dựng các tìm kiếm JSON, gửi chúng đi và nhận được phản hồi từ máy chủ.

Dưới đây là một ví dụ về JSON được trả về:

{ 
    "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 
       ] 
      } 
     ] 
    } 
} 

Bây giờ, cắm này vào jsonlint.com (và biết một chút thông tin về JSON định dạng), thật dễ dàng để thấy rằng đây là hợp lệ JSON.

Tôi đang sử dụng lớp con AFHTTPClient để POST yêu cầu của tôi và nhận dữ liệu. Đây là mã tôi đang sử dụng để POST:

[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); 
    } 
}]; 

Không có gì thực sự đặc biệt ở đây, tôi chỉ chuyển phản hồi thành một số JSON.

Tuy nhiên, vấn đề là đối với điều này trong yêu cầu cụ thể, AFNetworking coi việc phản hồi là không thành công, vì vậy mã trong khối lỗi là mã duy nhất được thực hiện. Tôi nhận được lỗi sau:

(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.} 

Các JSON chứa một số mũ trong nó (4.439049394553e-312 đặc biệt), tuy nhiên đây là số hợp lệ và sẽ có thể được phân tích. Tôi nhận được cùng một NSError khi tôi cố gắng phân tích dữ liệu phản hồi bằng cách sử dụng NSJSONSerialization. Chỉ cần làm rõ - AFNetworking đang cung cấp cho tôi thông báo lỗi giống như NSJSONSerialization thực hiện.

Tôi không thể tìm thấy bất kỳ ai khác có cùng vấn đề với tôi và không thể hiểu tại sao JSON của tôi không thể được phân tích cú pháp. Nó rời khỏi ứng dụng của tôi với một lỗi rất lớn mà tôi không thể sửa chữa.

Nếu có ai đó có thể làm sáng tỏ vấn đề này, điều đó thật tuyệt vời. Nếu đó không phải là vấn đề với AFNetworking, nếu bạn có thể chỉ cho tôi một tài nguyên hữu ích cũng sẽ tuyệt vời. Tất nhiên, nếu bạn cần thêm bất kỳ thông tin nào, vui lòng yêu cầu

Cảm ơn bạn.

Trả lời

6

NSJSONSerialization sử dụng NSDecimalNumber để đại diện cho con số, và

[NSDecimalNumber decimalNumberWithString:@"4.439049394553e-312"] 

đã trả NaN, vì NSDecimalNumber thể đại diện cho chỉ số

mantissa x 10^exponent   where `-128 <= exponent <= 127`. 

Vì vậy, đây có vẻ là một "hạn chế" (hoặc bug) của NSJSONSerialization, chỉ hoạt động với số trong một phạm vi nhất định.

Tôi đã thực hiện kiểm tra nhanh với "SBJsonParser" và nó có cùng vấn đề.

+0

Tôi nghĩ bạn đang ở một nơi nào đó ở đây. Đó là một chút ngớ ngẩn như thế nào chúng tôi đang bị hạn chế với dữ liệu chúng tôi có thể giải mã. Tôi có thể nghĩ rằng họ sẽ bao gồm một số tùy chọn phân tích cú pháp JSON, để phân tích chúng thành chuỗi nếu chúng không thể được phân tích cú pháp dưới dạng một số. Sắp xếp theo cùng cách bạn có thể chuyển đổi thành NSData. –

+0

Không, NSJSONSerialization sử dụng NSNumber với giá trị nguyên cho số nguyên <10^18, NSDecimalNumber cho giá trị nguyên> = 10^18 và NSNumber với giá trị gấp đôi cho mọi thứ có dấu thập phân hoặc số mũ. – gnasher729

+0

@ gnasher729: Bạn có quyền có các trường hợp sử dụng NSNumber, không phải NSDecimalNumber. (Tôi cũng nhận thấy điều này trong cuộc thảo luận dài dòng ở đây http://stackoverflow.com/questions/20198040/how-to-determine-the-true-data-type-of-an-nsnumber#comment30126509_20198040). Nhưng có vẻ như bạn không hoàn toàn chính xác. '1.2e-3' cho (trong thử nghiệm của tôi) một NSDecimalNumber. '0,0012' cho một NSNumber có chứa gấp đôi. Và '4.439049394553e-312' vẫn không thành công. (Các thử nghiệm được thực hiện trong Trình mô phỏng iOS 7.) –

Các vấn đề liên quan