2016-10-27 23 views
0

スウィフトオブジェクトをJSONオブジェクトに変換してJSONオブジェクトをJSON文字列に変換し、ワイヤで渡してデコードする方法もう片側。Swift:特殊文字の解釈を抑止して文字列リテラルを提供する方法

問題は有効なJSON文字列を生成しています。

改行文字はJSON文字列でエスケープする必要がありますが、Swiftはその文字列をリテラルとして扱う代わりにエスケープ文字列内の特殊文字を解釈します。例えば

:印刷される内容

let a = "foobar\nhello\nworld" 
let escapedString = a.replacingOccurrences(of: "\n", with: "\\n") 

print(escapedString) 

ではなく、所望foobar\\nhello\\nworldfoobar\nhello\nworldあります。

スウィフトに文字列をリテラルとして扱い、特殊文字を解釈しないようにするにはどうしますか?

UPDATE

OOPerはdebugPrintがそのまま残り\\n文字を示し用いて、指摘しているように。

ただし、evaluateJavaScriptと組み合わせてWKWebViewと入力すると、\\nの文字は根本的な問題である\nに変わります。たとえば:

let script = "\(callback)(\'\(escapedString)\')"   
webView!.evaluateJavaScript(script) { (object: Any?, error: Error?) -> Void in 
    print("Done invoking \(callback)") 
} 

答えて

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) 
0

多分、出力をprintから解釈するのは間違いです。 foobar\nhello\nworld -

あなたはprint(escapedString)からfoobar\nhello\nworldを得る

escapedStringは20の文字が含まれています。

これは、"の間に囲まれた場合に有効なJSON文字列です。

あなたは文字列リテラルのような表記でエスケープ結果を確認したい場合は、あなたがdebugPrint使用することができます:evaluateJavaScriptで使用するときは、UPDATE

については

let a = "foobar\nhello\nworld" 
let escapedString = a.replacingOccurrences(of: "\n", with: "\\n") 

print(escapedString) //->foobar\nhello\nworld 
debugPrint(escapedString) //->"foobar\\nhello\\nworld" 

」をJSONのエスケープ文字列をJavaScriptで表現したい場合は、.jsファイル(または<script>...</script>)で記述する:

someFunc('foobar\\nhello\\nworld'); 

だから、あなたはこのような何かを書く必要があります。

let a = "foobar\nhello\nworld" 
let escapedForJSON = a.replacingOccurrences(of: "\n", with: "\\n") 
//In actual code, you may need a little more... 
let escapedForJavaScriptString = escapedForJSON.replacingOccurrences(of: "\\", with: "\\\\") 

let script = "\(callback)(\'\(escapedForJavaScriptString)\')" 
webView!.evaluateJavaScript(script) { (object: Any?, error: Error?) -> Void in 
    print("Done invoking \(callback)") 
} 
+0

これは偉大なポイントである、 'evaluateJavaScript.'の内部で使用された場合、\\ nは離れてどこに行くので、多分より多くのコードを投稿する必要があります – Crashalot

+0

更新された質問は、根本的な問題に関するご意見をお待ちしています – Crashalot

関連する問題