当 JSON 返回单个字符串时如何使用 Swift 的 JSONSerialization

nix*_*des 1 json nsjsonserialization swift

所以这可能是一个非常基本的问题,但我很好奇你将如何处理在 Swift 中使用 JSONSerialization 解析作为单个字符串返回的 JSON 对象。所以我在玩一个免费的哈利波特 API 并注意到其中一个路由返回一个字符串(https://www.potterapi.com/v1/sortinghat)并且它给出的响应只是一个字符串哈利波特里的四栋房子。

"Ravenclaw"

下面是我的尝试。

do {
    let json = try JSONSerialization.jsonObject(with: data, options: []) as? String
    print("json: \(json)")
} catch {
    print("Error: \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

我认为简单地将类型转换为 aString就足够了,但我只是收到以下错误:“错误:无法读取数据,因为它的格式不正确。

我知道有更好的方法来解析 JSON,例如使用 Codable,但我只是想在继续解决这个问题之前了解它是如何工作的。

Rob*_*ier 5

JSONSerialization 是错误的工具。你想使用 JSONDecoder,它在 Swift 中更有用:

let json = Data("""
"Ravenclaw"
""".utf8)

let result = try JSONDecoder().decode(String.self, from: json)
Run Code Online (Sandbox Code Playgroud)

请注意,这需要 iOS 13.1 或 macOS 10.15.1。否则,您将需要使用@vadian 的回答。

  • @RobNapier 我知道发生了什么事。*JSONEncoder 和 JSONDecoder 现在默认支持顶级“原始”类型(字符串、数字、布尔值)。* 它没有在 JSONDecoder 中实现,但显然在 iOS (13.1) 和 macOS (10.15.1) 上的“JSONSerialization”中实现。请参阅 https://bugs.swift.org/browse/SR-6163 上的评论。我还在莫哈韦沙漠。 (2认同)