iOS - NSJSONSerialization:无法将数据转换为字符串周围的字符串

时间:2013-01-14 15:08:22

标签: ios objective-c xcode cocoa-touch nsjsonserialization

我在解析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.}

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

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

4 个答案:

答案 0 :(得分:19)

是的,编码问题我遇到了同样的问题并得到了上述错误。我从服务器获得了NSData <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <WebPublishMethod>FileSystem</WebPublishMethod> <LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration> <LastUsedPlatform>Any CPU</LastUsedPlatform> <SiteUrlToLaunchAfterPublish /> <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish> <ExcludeApp_Data>False</ExcludeApp_Data> <publishUrl>C:\Developments\gsvc\Website</publishUrl> <DeleteExistingFiles>False</DeleteExistingFiles> </PropertyGroup> </Project> 。所以我必须在使用NSJSONSerialization解析之前将其转换为UTF8。

encoding:NSISOLatin1StringEncoding

答案 1 :(得分: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)
}

答案 2 :(得分:6)

检查您正在解析的数据是否实际上是有效的JSON(而不仅仅是'几乎'JSON)。当您有不同的数据格式无法解析为JSON时,就会发生该错误。例如见:

iOS 5 JSON Parsing Results in Cocoa Error 3840

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

{ "response" : "Success" }

<强>更新

JSON的默认编码是UTF-8。特殊/异国情调的字符不是UTF-8的问题,但请确保您的服务器正确地将其内容正确编码为UTF-8。另外,你有没有告诉过你的JSON解释器使用不同的编码?

如果您的JSON来自网络服务,请将网址放入此页面以查看有关编码的内容:

http://validator.w3.org/

答案 3 :(得分:0)

快捷键5:

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

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

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