2013-01-23 15 views
9

Mam problem z NSJSONSerialization czytanie JSON z Met Office Datapoint API.NSJSONSerialization - Nie można przekonwertować danych na ciąg

otrzymuję następujący błąd

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

Sprawdziłem i że jest to linia wykraczająca w zależności od położenia znaków

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

Sam JSON wydaje się być ważna według kilku Walidatory, których próbowałem, i oczekiwałbym, że również pochodzą od dużej organizacji, takiej jak Met Office.

Czy NSJSONSerialization nie działa dobrze z takimi postaciami jak "ó"?

Jeśli nie, to w jaki sposób zmienić typ kodowania, aby sobie z tym poradzić?

Wiele z góry dziękuję

+0

Wypróbuj inny pakiet JSON - taki, który akceptuje NSString - dzięki czemu można mieć pewność co do nawrócenia. –

Odpowiedz

21

Met Office Datapoint odsyła dane w ISO-8859-1, które nie jest jednym z obsługiwanych formatów danych dla NSJSONSerialization.

Aby to działało, najpierw utwórz ciąg znaków z treści URL za pomocą NSISOLatin1StringEncoding, a następnie utwórz NSData, którego chcesz użyć w NSJSONSerialization z kodowaniem NSUTF8.

następujące prace, aby utworzyć odpowiedni obiekt json

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

Korzystam z następujących NSData * data = [NSData dataWithContentsOfURL: kMetOfficeAllSites]; Z następującego adresu URL http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?res=daily&key= Następnie NSDictionary * json = [NSJSONSerialization JSONObjectWithData: dane opcje: kNilOptions Błąd: & error]; –

+1

Po prostu zadziałało. W rzeczywistości kodowanie z dataPoint to ISO-8859-1 (NSISOLatin1). wystarczy pobrać go w łańcuchu i utworzyć z niego NSData UTF-8. Aktualizuję moją odpowiedź powyżej. –

+0

Wielkie dzięki Eric za rozwiązanie. Sądzę, że będzie to najlepszy sposób na obsłużenie wszystkich JSON od Datapoint, ponieważ wszystko to prawdopodobnie będzie ISO-8859-1. Czy mogę zapytać, w jaki sposób znalazłeś typ kodowania? –

4

Co to jest kodowanie dla JSON? JSON ma być UTF-8, ale widziałem kiepskie API, w których używają ISO-8859-1. NSJSONSerialization działa tylko w UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE.

+0

Nie jestem pewien, najlepszym sposobem sprawdzenia kodowania, ale załadowałem kanał JSON w chrome i pod Tools/Encoding to powiedział Western (ISO-8859-1) więc wygląda na to, że mam pecha, czy możesz -kodować? –

Powiązane problemy