Swift:如何抑制特殊字符的解释并提供字符串文字

时间:2016-10-27 21:50:37

标签: ios json swift string

目标是通过将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)")
}

2 个答案:

答案 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。

之后的有效JSON字符串

如果您想以类似字符串的方式检查转义结果,可以使用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