服务器提供数据时,包含转义字符,因此解码为Decodable类型时会出错。即使我使用 JSONSerialization 将其更改为字典,在解码带有转义字符的数据时仍然会发生错误。
如何解决这个问题?
let jsonStr = """
{
"overview": "I \n love \n you."
}
"""
struct ResponseDTO: Decodable {
let overview: String?
enum CodingKeys: CodingKey {
case overview
}
init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.overview = try container.decodeIfPresent(String.self, forKey: .overview)
}
}
let jsonData = jsonStr.data(using: .utf8)!
func task() {
do {
let response = try JSONDecoder().decode(ResponseDTO.self, from: jsonData)
print(response)
} catch {
print("Failed to decode: \(error)")
}
}
task()
问题在于,当尝试解码容器时,由于转义字符而引发错误。 TT...
如何按原样使用转义 JSON 解码字符?
问题是您尝试使用 Swift 字符串模拟 JSON 数据。在 JSON 中,您可以通过使用反斜杠后跟字母 n (
\n
) 的转义序列来获得换行符。为了在 Swift 字符串文字中表示两个字符的序列,您需要使用另一个反斜杠转义反斜杠 (\\n
)。
换句话说,改变:
let jsonStr = """
{
"overview": "I \n love \n you."
}
"""
至:
let jsonStr = """
{
"overview": "I \\n love \\n you."
}
"""
生成的解码字符串将包含实际的换行符。
您还可以从结构中删除显式的
init
。
这是代码的完整工作版本和结果输出:
let jsonStr = """
{
"overview": "I \\n love \\n you."
}
"""
struct ResponseDTO: Decodable {
let overview: String?
enum CodingKeys: CodingKey {
case overview
}
}
let jsonData = jsonStr.data(using: .utf8)!
func task() {
do {
let response = try JSONDecoder().decode(ResponseDTO.self, from: jsonData)
print(response.overview ?? "")
} catch {
print("Failed to decode: \(error)")
}
}
task()
在 Swift Playground 中运行时,您会得到:
我
爱
你。