2013-01-23 18 views
9

Sto riscontrando un problema con NSJSONSerialization che legge JSON dall'API Datapoint di Met Office.NSJSONSerialization - Impossibile convertire i dati nella stringa

ottengo il seguente errore

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unable to convert data to string around character 58208. 

Ho controllato e che questa sia la linea incriminata in base alla posizione del carattere

{"id":"353556","latitude":"57.1893","longitude":"-5.0929","name":"Sóil Chaorainn"} 

Il JSON stesso sembra essere valida in base ad un paio di I validatori che ho provato, e mi aspetterei che provengano anche da una grande organizzazione come Met Office.

Non dovrebbe NSJSONSerialization funzionare correttamente con caratteri come 'ó'?

In caso contrario, come posso modificare il tipo di codifica per gestire questo problema?

Molte grazie in anticipo

+0

Provare un diverso pacchetto di JSON - quella che accetta un NSString - in modo da poter essere sicuri circa la conversione. –

risposta

21

Metapoint di Met Office invia i dati in ISO-8859-1 che non è uno dei formati di dati supportati per NSJSONSerialization.

Per farlo funzionare, creare una stringa dal contenuto dell'URL in primo luogo con NSISOLatin1StringEncoding e quindi creare il NSData che si desidera utilizzare in NSJSONSerialization con una codifica NSUTF8.

le seguenti opere per creare l'oggetto JSON corrispondente

NSError *error; 
NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?key=<YOUR_API_KEY"] encoding:NSISOLatin1StringEncoding error:&error]; 

NSData *metOfficeData = [string dataUsingEncoding:NSUTF8StringEncoding]; 

id jsonObject = [NSJSONSerialization JSONObjectWithData:metOfficeData options:kNilOptions error:&error]; 

if (error) { 
    //Error handling 
} else { 
    //use your json object 
    NSDictionary *locations = [jsonObject objectForKey:@"Locations"]; 
    NSArray *location = [locations objectForKey:@"Location"]; 
    NSLog(@"Received %d locations from the DataPoint", [location count]); 
} 
+0

Sto utilizzando il seguente NSData * data = [NSData dataWithContentsOfURL: kMetOfficeAllSites]; Dal seguente URL http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?res=daily&key= Then NSDictionary * json = [NSJSONSerialization JSONObjectWithData: data opzioni: kNilOptions errore: & errore]; –

+1

L'ho appena fatto funzionare. Infatti la codifica dal dataPoint è ISO-8859-1 (NSISOLatin1). devi solo metterlo in una stringa e creare un NSData UTF-8 da esso. Sto aggiornando la mia risposta sopra con esso. –

+0

Molte grazie Eric per la soluzione. Immagino che questo sia il modo migliore per gestire tutto il JSON di Datapoint poiché è probabile che sia ISO-8859-1. Posso chiederti come hai trovato il tipo di codifica? –

4

Qual è la codifica per il JSON? JSON dovrebbe essere UTF-8 ma ho visto API scadenti in cui usano ISO-8859-1. NSJSONSerialization funziona solo con UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE.

+0

Non sono sicuro che sia il modo migliore per controllare la codifica, ma ho caricato il feed JSON in chrome e in Tools/Encoding lo ha detto Western (ISO-8859-1) quindi sembra che non abbia fortuna, puoi -codificare? –

Problemi correlati