2013-01-23 35 views
9

Tôi đang gặp sự cố với NSJSONSerialization đọc JSON từ API Datapoint Met Office.NSJSONSerialization - Không thể chuyển đổi dữ liệu thành chuỗi

tôi nhận được lỗi sau

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

Tôi đã kiểm tra và nghĩ rằng đây là dòng vi phạm theo quy định của vị trí nhân vật

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

Các JSON bản thân dường như là hợp lệ theo một vài Những người kiểm chứng tôi đã thử, và tôi cũng mong đợi nó sẽ là từ một tổ chức lớn như Met Office.

NSJSONSerialization có nên hoạt động tốt với các ký tự như 'ó' không?

Nếu không làm cách nào để tôi thay đổi loại mã hóa để giải quyết vấn đề này?

Rất cám ơn trước

+0

Hãy thử một gói JSON khác nhau - một là chấp nhận một NSString - vì vậy bạn có thể chắc chắn về việc chuyển đổi. –

Trả lời

21

Datapoint Met Office gửi lại dữ liệu theo ISO-8859-1 không phải là một định dạng dữ liệu được hỗ trợ cho NSJSONSerialization.

Để làm cho nó hoạt động tạo ra một chuỗi từ nội dung URL lúc đầu với NSISOLatin1StringEncoding và sau đó tạo NSData bạn muốn sử dụng trong NSJSONSerialization với một mã hóa NSUTF8.

Các công trình sau đây để tạo ra các đối tượng tương ứng 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

Tôi đang sử dụng dữ liệu NSData * sau = [Dữ liệu NSDataWithContentsOfURL: kMetOfficeAllSites]; Từ URL sau http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?res=daily&key= Sau đó, NSDictionary * json = [NSJSONSerialization JSONObjectWithData: dữ liệu tùy chọn: kNilOptions lỗi: & lỗi]; –

+1

Chỉ cần làm cho nó hoạt động. Trong thực tế, mã hóa từ dataPoint là ISO-8859-1 (NSISOLatin1). bạn chỉ cần lấy nó trong một String và tạo một NSData UTF-8 từ nó. Tôi đang cập nhật câu trả lời của tôi ở trên với nó. –

+0

Rất cám ơn Eric vì giải pháp. Tôi đoán đây sẽ là cách tốt nhất để xử lý tất cả JSON từ Datapoint vì nó có khả năng là ISO-8859-1. Tôi có thể hỏi làm thế nào bạn tìm thấy loại mã hóa? –

4

Mã hóa cho JSON là gì? JSON được cho là UTF-8 nhưng tôi đã thấy các API tệ hại khi chúng sử dụng ISO-8859-1. NSJSONSerialization chỉ hoạt động UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE.

+0

Tôi không chắc chắn cách tốt nhất để kiểm tra mã hóa, nhưng tôi đã nạp nguồn cấp dữ liệu JSON bằng chrome và dưới Công cụ/Mã hóa mà Western cho biết (ISO-8859-1) có vẻ như tôi không may mắn, bạn có thể quay lại không -encode? –

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