目标是通过将Swift对象转换为JSON对象来序列化Swift对象,然后将JSON对象转换为可以通过线路传递并在另一端进行解码的JSON字符串。
问题在于产生有效的JSON字符串。
必须在JSON字符串中转义换行符,但Swift会解释转义字符串中的特殊字符,而不是将字符串视为文字。
例如:
let a = "foobar\nhello\nworld"
let escapedString = a.replacingOccurrences(of: "\n", with: "\\n")
print(escapedString)
打印的内容为foobar\nhello\nworld
,而不是所需的foobar\\nhello\\nworld
。
你如何告诉Swift将字符串视为文字,而不是解释其中的特殊字符?
更新
正如OOPer指出的那样,使用debugPrint
会显示\\n
字符保持不变。
但是,当与evaluateJavaScript
中的WKWebView
配对时,\\n
个字符会变为\n
,这是根本问题。例如:
let script = "\(callback)(\'\(escapedString)\')"
webView!.evaluateJavaScript(script) { (object: Any?, error: Error?) -> Void in
print("Done invoking \(callback)")
}
答案 0 :(得分:1)
javascript模板文字中没有未转义的字符串语法,这可能就是你要找的;也许他们将来会添加它。不幸的是,你必须逃避每一个有时看起来非常粗糙的斜线,如你的例子所示。
//This is the same as `foobar\nhello\nworld` where each char is a literal
let a = "foobar\\nhello\\nworld"
let escapedString = a.replacingOccurrences(of: "\\n", with: "\\\\n")
//This outputs `foobar\\nhello\\nworld`
print(escapedString)
答案 1 :(得分:0)
也许你只是错误地解释print
的输出。
当您从foobar\nhello\nworld
获得print(escapedString)
时,escapedString
包含20个字符 - f
o
o
b
{{ 1}} a
r
\
n
h
e
l
l
o
{{ 1}} \
n
w
o
r
。
这是l
s。
如果您想以类似字符串的方式检查转义结果,可以使用d
:
"
更新
与debugPrint
一起使用时,您最好将什么是正确的代码视为JavaScript,如果您想在JavaScript中表示JSON转义字符串,则可以使用.js文件(或{ {1}}):
let a = "foobar\nhello\nworld"
let escapedString = a.replacingOccurrences(of: "\n", with: "\\n")
print(escapedString) //->foobar\nhello\nworld
debugPrint(escapedString) //->"foobar\\nhello\\nworld"
所以,你可能需要写这样的东西:
evaluateJavaScript