swift无法使用转义序列解码字符串
Posted
技术标签:
【中文标题】swift无法使用转义序列解码字符串【英文标题】:swift can't decode string with escape sequence 【发布时间】: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)
如何正确解码?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于swift无法使用转义序列解码字符串的主要内容,如果未能解决你的问题,请参考以下文章
无法在 C# 中使用 Regex.Unescape 删除转义序列
使用 Codable 序列化为 JSON 时的 Swift 字符串转义
Newtonsoft 转义 JSON 字符串无法反序列化为对象
SyntaxError: (unicode error) 'unicodeescape' 编解码器无法解码位置 12-13 截断 \UXXXXXXXX 转义的字节