【问题标题】:swift can't decode string with escape sequenceswift无法使用转义序列解码字符串
【发布时间】:2021-02-18 06:28:31
【问题描述】:

我有格式为SO\/ME\/STR\/ING 的字符串。我想要模拟 json 进行测试。当我使用以下格式创建 json 时:

let json = """
{ "str": "SO\/ME\/STR\/ING" } // Error: Invalid escape sequence in literal
"""

我写的就像SO\\/ME\\/STR\\/ING。但它解码不正确:

let json = """
{
    "str": "SO\\/ME\\/STR\\/ING",
}
"""
let jsonData = Data(json.utf8)

let decoder = JSONDecoder()

do {
    let model = try decoder.decode(Model.self, from: jsonData)
    print(model) // Model(str: "SO/ME/STR/ING")
} catch {
    print(error.localizedDescription)
}

如何正确解码?

【问题讨论】:

    标签: json swift decode


    【解决方案1】:

    您需要在 swift 字符串中使用 4 个反斜杠来表示 model.str 中的实际反斜杠:

    let json = """
    {
        "str": "\\\\",
    }
    """
    let jsonData = Data(json.utf8)
    
    let decoder = JSONDecoder()
    
    do {
        let model = try decoder.decode(Model.self, from: jsonData)
        print(model.str) // prints a single backslash
    } catch {
        print(error.localizedDescription)
    }
    

    JSON 字符串中的反斜杠需要转义,因此您需要在 JSON 字符串中使用 2 个反斜杠,但要将其写在 Swift 字符串文字中,您需要也逃避这两个反斜杠。因此有 4 个反斜杠。

    【讨论】:

      【解决方案2】:

      您可以使用原始字符串文字 (#"..."#) 又名 Extended String Delimiters 来表示这个转义字符串,就像“所见即所得”:

      let string = #"""
      "SO\/ME\/STR\/ING"
      """#
      

      注意:您的 JSON 字符串应该是有效的 JSON,并且如果需要也必须正确转义: 两个字符序列“\/”转义了“solidus”(在 JSON 术语中)。上面的字符串将打印为“SO/ME/STR/ING”。

      如果您希望将其打印为SO\/ME\/STR\/ING,您的 JSON 字符串文字可以定义为

      let json = #"""
      {
          "str": "SO\\/ME\\/STR\\/ING"
      }
      """#
      

      上面的字符串字面量是一个valid JSON String,分别是一个有效的JSON Object,可以按原样使用。然而,这并不意味着它是你所期望的;)

      您必须先使用 Unicode (UTF-8) 将字符串文字转换为数据值,然后才能在 JSON 解码器中使用。

      另见:https://www.hackingwithswift.com/articles/162/how-to-use-raw-strings-in-swift

      【讨论】:

        猜你喜欢
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多