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.}

任何建议如何解决这个问题?

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

4

4 回答 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];
于 2016-02-11T11:37:01.797 回答
7

斯威夫特 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)
}
于 2017-01-04T18:02:05.800 回答
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/

于 2013-01-14T15:28:59.337 回答
3

斯威夫特 5:

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

解决方案:您必须首先将响应数据转换为字符串,然后在解码之前使用 UTF8 编码将该字符串转换为数据。

let utf8Data = String(decoding: responseData, as: UTF8.self).data(using: .utf8)
于 2019-05-30T04:55:47.147 回答