json - 如何读取折叠的 UTF-8 字符串

标签 json swift string macos encoding

我正在尝试从这个地址读取 JSON

http://www.defense.gov/data.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/

相关文章:

json - 在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

ios - 使用 Swift 在 xcode 6 中将背景添加到 ios 应用程序

c - 为什么将字符串直接传递给 printf 可以正常工作?

javascript - 当数据为零时,Flot 饼图呈现图例但不呈现空图表

c# - 反序列化字符串化的 JSON 对象

json - 无法使用lift-json将json解析为 `ProvinceJson`类

c++ - C++ 字符串类可以进行指针运算吗?

Swift 的 pow() 函数不接受 Doubles 作为参数

swift - 我怎样才能摆脱 View Controller 中的关闭?

c - 当 2 个字符串相等时,strcmp 返回 1,为什么?