2014-04-14 53 views
1

真的在爲這個掙扎!我正在構建一個顯示WebView(iOS上的UIWebView)的Android和iPhone應用程序。該WebView有它加載的HTML網頁,其中包含定義爲一個簡單的JavaScript函數如下:如何將JSON對象轉換爲JavaScript函數?

function parseJson(input) 
{ 
    alert("start of parseJson(...) JavaScript method"); 
    var parsedJson = JSON.parse(input); 
    alert("end of parseJson(...) JavaScript method"); 
} 

我想要做的就是打電話給我parseJson(input)的JavaScript從Android/iOS版客戶端傳遞一個string作爲函數輸入參數。這樣做是爲了Xamarin.Android做如下:

string json = "{}" 
myWebView.LoadUrl ("javascript:parseJson(\"" + json + "\")")); 

而如下的Xamarin.iOS:

string json = "{}" 
myWebView.EvaluateJavascript ("parseJson(\"" + json + "\")"); 

到這裏,這工作正常。沒問題。 JavaScript函數被調用並執行。另外,我知道我在我的string要仔細逃脫引號標記字符,如下所示:

string json = "{\\\"key\\\":\\\"value\\\"}"; 

這也能正常工作。 JavaScript函數被調用並執行。雙逃逸"\r""\n"(至"\\\r""\\\n")也適用。但是,如果JSON字符串包含"\\","\b","\t""\f",那麼我的JavaScript函數中的JSON.parse(...)調用會翻轉(即使該字符是雙重轉義的)。

任何想法,我可以可靠地從客戶端內部逃脫我的JSON字符串之前,我把它喂到我的JavaScript函數?

回答

6

原來我不得不將參數傳遞給我的JavaScript函數,如下所示:

string EscapeJavaScriptFunctionParameter(string param) { 
    char[] chars = param.ToCharArray(); 

    StringBuilder sb = new StringBuilder(); 

    for (int i = 0; i < chars.Length; i++) 
    { 
    switch (chars [i]) { 
    case '\\': 
     sb.Append ("\\\\"); 
     break; 
    case '\n': 
     sb.Append ("\\n"); 
     break; 
    case '\r': 
     sb.Append ("\\r"); 
     break; 
    case '\b': 
     sb.Append ("\\b"); 
     break; 
    case '\f': 
     sb.Append ("\\f"); 
     break; 
    case '\t': 
     sb.Append ("\\t"); 
     break; 
    default: 
     sb.Append (chars[i]); 
     break; 
    } 

    return sb.ToString(); 
} 

這不是完整的轉義方法,但只是演示如何逃避最常見的JavaScript特殊字符。

使用這種方法,我把我的JavaScript函數從我的Android項目如下:

string json = "{\"key\":\"value\"}"; 
string escapedJson = EscapeJavaScriptFunctionParameter(json); 
myWebView.LoadUrl ("javascript:parseJson(JSON.stringify(" + escapedJson + "))"); 

從我的iOS項目如下:

string json = "{\"key\":\"value\"}"; 
string escapedJson = EscapeJavaScriptFunctionParameter(json); 
myWebView.EvaluateJavascript ("parseJson(JSON.stringify(" + escapedJson + "))"); 
+0

'StringEscapeUtils.escapeECMAScript(string)'在Java中工作。 – EpicPandaForce

+0

我發現我需要逃避撇號,所以我添加了以下內容: case 39://撇號 sb。附加(」\\'」); 休息; – NightSkyDev

+0

這種方法並不能逃避「和」,如果你沒有逃過引號,頁面可能會被黑客入侵。 –

2

,如果你嘗試這樣會發生什麼:(或不適合你的情況下)

myWebView.EvaluateJavascript("parseJson('{\"key\":\"value\"}')"); 

JSON.stringify()看起來太有用你的情況:

myWebView.EvaluateJavascript("parseJson(JSON.stringify({key:value}))"); 
+0

感謝您的幫助。如果字符串本身包含單引號,則在JSON對象字符串周圍使用單引號(即'')將不起作用。另一方面,'JSON.stringify(...)'方法被證明是一顆寶石!感謝那。我仍然沒有完全得到解決方案,但我認爲我幾乎在那裏。觀看此空間... –

+0

幾乎完美,只需要JSON.stringify({\「key \」:\「value \」}) – david72