如何阻止 Swift 在我的 [String] 中注入转义的单引号?

Posted

技术标签:

【中文标题】如何阻止 Swift 在我的 [String] 中注入转义的单引号?【英文标题】:How do I stop Swift from injecting escaped single quotes in my [String]? 【发布时间】:2019-08-22 22:21:02 【问题描述】:

我正在尝试打印一个没有转义单引号的字符串数组。出于某种原因,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!)

【问题讨论】:

这只是字符串的调试表示 是的,但是当我添加这个数组来生成 JSON 时,会出现转义的引号......我可能需要一点时间来发布一个示例...... 【参考方案1】:

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

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

您所依赖的事实是,description 的实现恰好会产生与 JSON 相同的格式大部分时间。可以看到,当数组元素中有'时,说明是无效的JSON。

基本上,您不应依赖description 来生成 JSON。相反,您应该使用 Codable 从 Swift 数组生成 JSON 数据。

对于您要生成的 JSON:


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

你可以使用这样的结构:

struct Names : Codable 
    let names: [String]

然后您可以像这样生成 JSON Data

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

【讨论】:

是的......呃......我想我做了一个错误的假设......我可能应该在任何地方都这样做。谢谢! @TNo 如果您认为我的回答回答了您的问题,请考虑通过单击该复选标记接受它!

以上是关于如何阻止 Swift 在我的 [String] 中注入转义的单引号?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:当定时器触发时,如何阻止平移手势取消?

如何阻止用户,如果他/她在我的应用程序加载时没有连接到互联网连接

Swift - UITableView 中的标题阻止按钮交互

Swift 4.x/5.x 中是不是有多个全局变量副本?如果是这样,你如何阻止它?

使用 Swift 4 的 Codable 进行解码时,是啥阻止了我从 String 到 Int 的转换?

在swift中使用present时如何阻止ViewController闪烁