我正在尝试从这个地址读取 JSON
但是这个数据在第2771行包含非法字符0x92,所以
try! String( contentsOf: URL( string: "http://www.defense.gov/data.json" )!, encoding: .utf8 )
崩溃,异常如下。
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=261 "The file “data.json” couldn’t be opened using text encoding Unicode (UTF-8)." UserInfo={NSURL=http://www.defense.gov/data.json, NSStringEncoding=4}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/
有什么方法可以在不编写自己的字符串读取器的情况下从该站点读取 JSON 吗?
最佳答案
查看内容,除单个 0x92 之外的所有字符都在 ASCII 范围内 (0x00...0x7F)。因此,您可以尝试使用编码 ISO-8859-1(别名 ISO-Latin-1),它将所有字节映射到 U+0000...U+00FF,因此可能不会导致编码问题。
var rawStr = try! String(contentsOf: URL(string: "http://www.defense.gov/data.json")!, encoding: .isoLatin1)
如果需要,您可以删除该字符。
rawStr = rawStr.replacingOccurrences(of: "\u{92}", with: "")
并将其重新编码为有效的 UTF-8 数据:
let dataUTF8 = rawStr.data(using: .utf8)!
重新编码的数据可以用JSONSerialization
处理:
let json = try! JSONSerialization.jsonObject(with: dataUTF8) as! [String: Any]
以上所有代码都是为实验目的而编写的。所有 try!
、as!
或强制解包 (!
) 在这里都不安全,您可能需要以更安全的方式处理它们在实际应用中。而 String(contentsOf:)
可能会无限期地消耗时间,尤其是在通讯环境不佳的情况下。你不应该在实际应用程序的主线程中调用它。
关于json - 如何读取折叠的 UTF-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215510/