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

Posted

技术标签:

【中文标题】NSJSONSerialization - 无法将数据转换为字符串【英文标题】:NSJSONSerialization - Unable to convert data to string 【发布时间】:2013-01-23 17:36:32 【问题描述】:

我在使用 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 不应该对诸如“ó”之类的字符正常工作吗?

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

提前致谢

【问题讨论】:

尝试一个不同的 JSON 包——一个接受 NSString 的包——这样你就可以确定转换了。 【参考方案1】:

Met Office 数据点以 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 datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/… API> 然后 NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 刚刚成功。事实上,dataPoint 的编码是 ISO-8859-1 (NSISOLatin1)。你只需要在一个字符串中获取它并从中创建一个 UTF-8 NSData。我正在用它更新我上面的答案。 非常感谢 Eric 的解决方案。我想这将是处理来自 Datapoint 的所有 JSON 的最佳方式,因为它很可能是 ISO-8859-1。请问你是怎么找到编码类型的? 不客气,它不是那么优雅,但它确实有效。为了找到编码,我在命令行上使用了 curl http://...... -o outputfile 然后查看了文件的编码。数据点的 HTTP 标头上没有任何内容(对我来说这是一个错误) 是的,我可能会尝试联系他们并询问 JSON 的编码及其 HTTP 标头。但是我在这方面的知识并不多。再次非常感谢。【参考方案2】:

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

【讨论】:

我不确定检查编码的最佳方法,但我在 chrome 中加载了 JSON 提要,在工具/编码下它说西方(ISO-8859-1)所以看起来我是不走运,你能重新编码吗?

以上是关于NSJSONSerialization - 无法将数据转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Swift - NSJsonSerialization - “无法将数据转换为围绕字符的字符串”错误

无法使用 NSJSONSerialization 将数字转换为 JSON 值

Swift 2 - NSJSONSerialization.JSONObjectWithData 处理错误 [重复]

NSJSONSerialization 无法解析有效的 JSON - “垃圾结束”

NSJSONSerialization 包含正斜杠的字符串序列化 / 和 HTML 被错误地转义

使用 NSDictionary 访问 NSJSONSerialization 数据