swift 无法解码带有转义序列的字符串
swift can't decode string with escape sequence
我有格式为 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)
}
如何正确解码?
您需要在 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 个反斜杠。
您可以使用原始字符串文字 (#"..."#
) 又名 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"
}
"""#
上面的字符串文字是一个 有效 JSON 字符串,分别是一个有效的 JSON 对象,可以按原样使用。但是,这并不意味着它就是您所期望的 ;)
您必须先使用 Unicode (UTF-8) 将字符串文字转换为数据值,然后才能在 JSON 解码器中使用。
另请参阅:https://www.hackingwithswift.com/articles/162/how-to-use-raw-strings-in-swift
我有格式为 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)
}
如何正确解码?
您需要在 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 个反斜杠。
您可以使用原始字符串文字 (#"..."#
) 又名 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"
}
"""#
上面的字符串文字是一个 有效 JSON 字符串,分别是一个有效的 JSON 对象,可以按原样使用。但是,这并不意味着它就是您所期望的 ;)
您必须先使用 Unicode (UTF-8) 将字符串文字转换为数据值,然后才能在 JSON 解码器中使用。
另请参阅:https://www.hackingwithswift.com/articles/162/how-to-use-raw-strings-in-swift