2013-09-06 18 views
6

この問題を解決するために何時間もハッキングしています。私の唯一の選択肢は、誰かが何かを流すことができるかどうかを確認するためですこの問題についての光それはAFNetworkingの問題かもしれません、または(おそらく)、私のコードの問題かもしれません。有効なJSONですが、AFNetworking/NSJSONSerializationの「Cocoa error 3840」

私の使用しているコードは、アプリケーション内の操作の99%に対して完全に機能します。 JSON検索を構築し、それらを送信し、サーバーからの応答を受け取ることで、Elastic Searchを活用するアプリケーションを開発しています。ここで

が返される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であることを確認するのは簡単です。

リクエストをPOSTしてデータを受け取るためにAFHTTPClientサブクラスを使用しています。ここで私は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); 
    } 
}]; 

ここは本当に特別なものは何も、私はいくつかの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の問題ではない場合は、素晴らしいリソースでもあります。もちろん、何か情報が必要な場合は、お問い合わせください

ありがとうございます。

答えて

6

NSJSONSerialization番号を表すためにNSDecimalNumberを使用し、NSDecimalNumberは数字

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

のみを表すことができますので、

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

が既にだから、これは "制限"(またはバグ)のようです、NaNを返すのNSJSONSerialization、特定の範囲内の の番号でのみ動作することを確認してください。

「SBJsonParser」で簡単にテストしましたが、同じ問題がありました。

+0

私はあなたが何かここにいると思います。私たちが解読できるデータにどのように制限されているのかはちょっとばかげています。 JSON構文解析オプションを何らかの形で組み込んで、解析することができない場合は文字列として解析すると思います。 NSDataに不可逆変換するのと同じ方法で並べ替えます。 –

+0

いいえ、NSJSONSerializationは、整数値が10^18未満の場合はNSNumber、整数値が10より大きい場合はNSDecimalNumber、小数点または指数を含むすべての場合は2値のNSNumberを使用します。 – gnasher729

+0

@ gnasher729:NSDecimalNumberではなくNSNumberが使用される場合があります。 (私はこれも、ここでの長年にわたる議論の中で気づいた。http://stackoverflow.com/questions/20198040/how-to-determine-the-true-data-type-of-an-nsnumber#comment30126509_20198040)。しかし、あなたは完全に正しいとは思われません。 '1.2e-3'はNSDecimalNumberを(私のテストで)与えます。 '0.0012'はダブルを含むNSNumberを与えます。 「4.439049394553e-312」はまだ失敗します。 (iOS 7 Simulatorでテストが完了しました) –

関連する問題