如何在JSON returns单个字符串时使用Swift的JSON序列化

How to use Swift's JSONSerialization when JSON returns a single string

所以这可能是一个非常基本的问题,但我很好奇您如何使用 JSONSerialization in [=] 将 JSON 对象解析为单个字符串34=]。所以我正在玩免费的哈利波特 API 并注意到其中一条路线 returns 是一个字符串 (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)")
}

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

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

JSONSerialization 是错误的工具。您想使用 JSONDecoder,它在 Swift:

中更有用
let json = Data("""
"Ravenclaw"
""".utf8)

let result = try JSONDecoder().decode(String.self, from: json)

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

要反序列化非集合类型,您必须设置 .allowFragments 选项

let jsonString = """
"Slytherin"
"""

do {
    if let json = try JSONSerialization.jsonObject(with: Data(jsonString.utf8), options: .allowFragments) as? String {
        print("json: ", json)
    }
} catch {
    print("Error: ", error)
}

JSONDecoder 不起作用,它使用 no 选项调用底层 JSONSerialization .

字符串反序列化为字符串的意义又是一个问题,这个也是一样

if let json = String(data: data, encoding: .utf8) {
    print("json: \(json)")
}

编辑: JSONDecoder 是否适用于 iOS 13.1+ 和 macOS 10.15.1+