所以这可能是一个非常基本的问题,但是我很好奇您如何处理在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,但我只是在尝试解决该问题之前试图理解它的工作原理。
答案 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 +