iOS - NSJSONSerialization:无法将数据转换为字符串,字符附近

4

我在解析JSON时遇到了这个错误:

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unable to convert data to string around character 73053.) UserInfo=0x1d5d8250 {NSDebugDescription=Unable to convert data to string around character 73053.}

有什么建议可以解决这个问题吗?

添加如错误报告所述,解析器无法通过JSON响应中位置73053的字符,该字符为“ø”。据我所知,像Ø,Å,Æ等字符不应该是json解析器的问题吗?


你有检查响应字符串吗?能展示一下吗? - user1111278
请检查您的响应是否为有效的JSON。 - propstm
我已经在JSON验证器上检查了我的JSON,看起来它是有效的。 - Oleg
你能发一下你的回复吗?谷歌搜索这个错误会显示一些人有有效的JSON,但是他们的响应格式不正确。例如:http://stackoverflow.com/questions/9282771/cocoa-error-3840-nsjsonserialization 和 http://stackoverflow.com/questions/9282771/cocoa-error-3840-nsjsonserialization - propstm
也许你应该发布包含问题字符周围的JSON代码片段。 - Hot Licks
4个回答

22

是的,我有和编码问题相同的问题,也遇到了上面提到的错误。我从服务器获取的NSData使用了encoding:NSISOLatin1StringEncoding编码。所以在使用NSJSONSerialization解析之前,我必须将它转换为UTF8。

NSError *e = nil;
NSString *iso = [[NSString alloc] initWithData:d1 encoding:NSISOLatin1StringEncoding];
NSData *dutf8 = [iso dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:dutf8 options:NSJSONReadingMutableContainers error:&e];

你好,你能看到返回的编码是哪个吗?在你的情况下,它是NSISOlating1stringEncoding,我该如何找出我的返回值是什么? - isJulian00

7

Switf 3

let responseStrInISOLatin = String(data: data, encoding: String.Encoding.isoLatin1)
guard let modifiedDataInUTF8Format = responseStrInISOLatin?.data(using: String.Encoding.utf8) else {
      print("could not convert data to UTF-8 format")
      return
 }
do {
    let responseJSONDict = try JSONSerialization.jsonObject(with: modifiedDataInUTF8Format)
} catch {
    print(error)
}

6

请确认您要解析的数据确实是有效的JSON,而不仅仅是“近乎”JSON。当您有另一种无法解析为JSON的数据格式时,该错误就会发生。例如:

iOS 5 JSON解析导致Cocoa错误3840

您的JSON中是否也有顶级容器?例如数组或字典。例如:

{ "response" : "Success" }

更新

JSON的默认编码是UTF-8。对于UTF-8来说,特殊/外语字符不是问题,但请确保您的服务器以UTF-8正确编码其内容。此外,您是否做了任何事情告诉您的JSON解释器使用不同的编码方式?

如果您的JSON来自Web服务,请将URL放入此页面中以查看有关编码的信息:

http://validator.w3.org/


是的,必须确保发送的字符编码与解析器期望的字符编码完全相同。DBCS编码方案冲突很可能是问题所在。 - Hot Licks
稍有延迟地接受您的答案 :-) 通过使用UTF-8编码输出字符串解决了问题。 - Oleg
非常有帮助!有时服务器端可能会使用GBK编码回调我们,从而可能导致这个问题。在我的情况下,我已经注意到数据编码是GBK,因此我手动将编码转换为NSUTF8。 - lynulzy

3

Swift 5:

是的,当我解析JSON数据时也遇到了同样的错误。

解决方法:首先将响应数据转换为字符串,然后使用UTF8编码将该字符串转换为数据,然后再进行解码。

let utf8Data = String(decoding: responseData, as: UTF8.self).data(using: .utf8)

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