首页 > 解决方案 > 如何阻止 Swift 在我的 [String] 中注入转义的单引号?

问题描述

我正在尝试打印出一个没有转义单引号的字符串数组。出于某种原因,Swift 在打印我的数组时注入了转义的单引号。当我使用数组构建 JSON 时,这有一个涓滴问题。由于转义的单引号,JSON 最终无法解析。

我认为这是我的代码的问题,但我已将其提炼为一个应该简单明了的用例。

let names = ["Tommy 'Tiny' Lister", "Tom Hanks"]
print(names)

输出是:

[“汤米\'小\'李斯特”,“汤姆汉克斯”]

注意:我的名称数组中没有包含转义的单引号。

我该如何防止这种情况发生?

这是我稍后在创建 JSON 的代码中所做的。为简洁起见,这是我正在做的一个非常愚蠢的版本:

var names = ["Tommy Tiny Lister", "Tom Hanks"]

var jsonString = """
{"names": \(names)}
"""

var jsonData = jsonString.data(using: .utf8)

if let json = try? JSONSerialization.jsonObject(with: jsonData!) as? [String: Any] {
    let jsonData = try! JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
    let string = String(data: jsonData, encoding: .utf8)
    print(string!)
}

标签: iosarraysswiftescapingsingle-quotes

解决方案


您正在做的是使用 Swift 数组description生成 JSON:

var jsonString = """
{"names": \(names)}
""" // your JSON will contain name.description

您依赖于这样一个事实,即在大多数description情况下,恰好发生了与 JSON 相同的格式。如您所见,当数组元素中有时,描述不是有效的 JSON。'

基本上,您不应该依赖于description生成 JSON。相反,您应该使用CodableSwift 数组生成 JSON 数据。

对于您要生成的 JSON:

{
    "names": ["Tommy 'Tiny' Lister", "Tom Hanks"]
}

您可以使用这样的结构:

struct Names : Codable {
    let names: [String]
}

然后你可以Data像这样生成 JSON:

let encoder = JSONEncoder()
do {
    let obj = Names(names: ["Tommy 'Tiny' Lister", "Tom Hanks"])
    let data = try encoder.encode(obj)
} catch { ... }

推荐阅读