Ho hackerato via per ore cercando di risolvere questo problema senza alcun risultato - sembra che la mia unica possibilità sia di postare qui per vedere se qualcuno può gettare un po ' luce su questo problema. Potrebbe trattarsi di un problema con AFNetworking o (più probabile), potrebbe essere un problema con il mio codice.JSON valido, ma "errore Cocoa 3840" da AFNetworking/NSJSONSerialization
Il codice che sto utilizzando funziona perfettamente per il 99% delle operazioni all'interno della mia applicazione. Sto sviluppando un'applicazione che sfrutta la ricerca elastica creando ricerche JSON, inviandole e ricevendo una risposta dal server.
Ecco un esempio di JSON che viene restituito:
{
"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
]
}
]
}
}
Ora, collegando questo in jsonlint.com (e conoscere un po 'di formattazione JSON), è facile vedere che questo è valido JSON.
Sto utilizzando una sottoclasse AFHTTPClient per inviare la mia richiesta e ricevere dati. Ecco il codice che sto usando per 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);
}
}];
Niente di speciale qui, sto solo girando la risposta in qualche JSON.
Tuttavia, il problema è che per questa richiesta in particolare, AFNetworking considera la risposta come un errore, quindi il codice nel blocco di errore è l'unico codice in esecuzione. Sto ottenendo il seguente errore:
(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.}
Il JSON contiene un numero esponenziale in esso (4.439049394553e-312 in particolare), ma questo è il numero valido e dovrebbe essere in grado di essere analizzato. Ottengo lo stesso NSError quando provo ad analizzare i dati di risposta usando NSJSONSerialization. Giusto per chiarire: AFNetworking mi sta dando lo stesso messaggio di errore di NSJSONSerialization.
Non riesco a trovare nessun altro che abbia lo stesso problema di me e non riesca a capire perché il mio JSON non può essere analizzato. Lascia la mia app con un bug molto grande che non riesco a risolvere.
Se qualcuno potesse far luce su questo problema, sarebbe fantastico. Se non si tratta di un problema con AFNetworking, potresti indicarmi una risorsa utile che sarebbe anche fantastica. Naturalmente, se avete bisogno di ulteriori informazioni, per favore chiedete a
Grazie.
Penso che tu sia qui per qualcosa. È un po 'sciocco il modo in cui siamo limitati ai dati che possiamo decodificare. Avrei pensato che avrebbero incluso una sorta di opzione di analisi JSON, ad esempio, per analizzarli come stringhe se non possono essere analizzati come un numero. In modo simile allo stesso modo in cui è possibile eseguire la conversione in perdita a NSData. –
No, NSJSONSerialization utilizza NSNumber con valori interi per numeri interi <10^18, NSDecimalNumber per valori interi> = 10^18 e NSNumber con valori doppi per tutto ciò che ha un punto decimale o esponente. – gnasher729
@ gnasher729: Hai ragione che ci sono casi in cui viene utilizzato NSNumber, non NSDecimalNumber. (L'ho notato anche durante la discussione prolissa qui http://stackoverflow.com/questions/20198040/how-to-determine-the-true-data-type-of-an-nsnumber#comment30126509_20198040). Ma sembra che tu non sia del tutto corretto. '1.2e-3' fornisce (nel mio test) un NSDecimalNumber. '0,0012' fornisce un NSNumber che contiene un doppio. E '4.439049394553e-312' non riesce ancora. (Test eseguiti su iOS 7 Simulator.) –