NSJSONSerialization - 无法将数据转换为字符串

9
我在使用Met Office Datapoint API读取JSON时遇到了问题,具体表现为NSJSONSerialization报错。错误信息如下:
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不应该可以很好地处理像'ó'这样的字符吗?

如果不能,我该如何更改编码类型以处理此问题?

提前感谢您的帮助。


尝试使用另一个JSON包——接受NSString的包——这样你就可以确保转换正确。 - Hot Licks
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]);
}

我正在使用以下NSData* data = [NSData dataWithContentsOfURL:kMetOfficeAllSites]; 来自以下URL http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?res=daily&key=<MY API> 接着 NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; - Matt Price
1
刚刚让它工作了。实际上,dataPoint的编码是ISO-8859-1(NSISOLatin1)。你只需要将其转换为字符串并创建一个UTF-8 NSData即可。我会在上面更新我的答案。 - Eric Genet
非常感谢Eric提供的解决方案。我想这将是处理来自Datapoint的所有JSON的最佳方式,因为它们都很可能是ISO-8859-1编码。我可以问一下你是如何找到编码类型的吗? - Matt Price
不用客气,虽然不太优雅但是它能用。为了找到编码,我在命令行上使用了curl http://...... -o outputfile,然后查看了文件的编码。数据点的HTTP头中没有任何内容(对我来说这是一个错误)。 - Eric Genet
是的,我可能会尝试联系他们并询问JSON的编码和HTTP头。但是我在这个领域没有太多的知识。再次感谢。 - Matt Price

4

JSON 的编码是什么?JSON 应该是 UTF-8,但我见过一些糟糕的 API 在使用 ISO-8859-1。NSJSONSerialization 只能处理 UTF-8、UTF-16LE、UTF-16BE、UTF-32LE 和 UTF-32BE。


我不确定检查编码的最佳方法,但我在Chrome中加载了JSON源,并在“工具/编码”下发现它说西方(ISO-8859-1),所以看起来我没什么办法,你能重新编码吗? - Matt Price

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接