JSON的值中存在转义字符,导致解码错误

问题描述 投票:0回答:1

服务器提供数据时,包含转义字符,因此解码为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 解码字符?

json swift parsing escaping codable
1个回答
0
投票

问题是您尝试使用 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 中运行时,您会得到:



你。

© www.soinside.com 2019 - 2024. All rights reserved.