9

我在使用 NSJSONSerialization 从 Met Office Datapoint API 读取 JSON 时遇到问题。

我收到以下错误

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

我已经检查并认为这是根据字符位置的违规行

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

根据我尝试的几个验证器,JSON 本身似乎是有效的,我希望它也来自一个大型组织,例如 Met Office。

NSJSONSerialization 不应该适用于诸如“ó”之类的字符吗?

如果不是,我该如何改变编码类型来处理这个问题?

提前谢谢了

4

2 回答 2

21

气象局数据点以 ISO-8859-1 发回数据,这不是 NSJSONSerialization 支持的数据格式之一。

为了使其工作,首先使用 NSISOLatin1StringEncoding 从 URL 内容创建一个字符串,然后使用 NSUTF8 编码创建要在 NSJSONSerialization 中使用的 NSData。

以下工作创建相应的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]);
}
于 2013-01-23T18:31:41.927 回答
4

JSON 的编码是什么?JSON 应该是 UTF-8,但我看到他们使用 ISO-8859-1 的糟糕 API。NSJSONSerialization 仅适用于 UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE。

于 2013-01-23T17:47:23.483 回答