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

时间:2019-12-08 14:45:32

标签: json swift nsjsonserialization

所以这可能是一个非常基本的问题,但是我很好奇您如何处理在Swift中使用JSONSerialization解析作为单个字符串返回的JSON对象。因此,我在玩一个免费的Harry Potter API,并注意到其中一条路线返回一个字符串(https://www.potterapi.com/v1/sortinghat),并且给出的响应只是Harry Potter中四个房屋之一的单个字符串。

"Ravenclaw"

下面是我的尝试。

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

我认为只需将类型转换为String就足够了,但是我只收到以下错误:“ 错误:由于格式不正确,无法读取数据。

我知道有更好的解析JSON的方法,例如使用Codable,但我只是在尝试解决该问题之前试图理解它的工作原理。

2 个答案:

答案 0 :(得分:4)

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的答案。

答案 1 :(得分:1)

要反序列化非集合类型,您必须设置.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不起作用,它使用 选项调用基础JSONSerialization

将字符串反序列化为字符串的感觉是另一个问题,这是相同的

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

编辑: JSONDecoder 可以在iOS 13.1+和macOS 10.15.1 +

上运行