如何在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+
所以这可能是一个非常基本的问题,但我很好奇您如何使用 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+