真的很纠结这个问题!我正在构建一个显示 WebView
(在 iOS 上为 UIWebView
)的 Android 和 iPhone 应用程序。 WebView
加载了一个 HTML 页面,其中包含一个简单的 JavaScript 函数,定义如下:
function parseJson(input)
{
alert("start of parseJson(...) JavaScript method");
var parsedJson = JSON.parse(input);
alert("end of parseJson(...) JavaScript method");
}
我想做的是从传入 string
作为输入参数的 Android/iOS 客户端调用我的 parseJson(input)
JavaScript 函数。对于 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 函数之前从客户端中可靠地转义它有什么想法吗?
最佳答案
事实证明,我必须转义要输入我的 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 特殊字符。
使用这种方法,我从我的 Android 项目中调用我的 JavaScript 函数,如下所示:
string json = "{\"key\":\"value\"}";
string escapedJson = EscapeJavaScriptFunctionParameter(json);
myWebView.LoadUrl ("javascript:parseJson(JSON.stringify(" + escapedJson + "))");
来 self 的 iOS 项目如下:
string json = "{\"key\":\"value\"}";
string escapedJson = EscapeJavaScriptFunctionParameter(json);
myWebView.EvaluateJavascript ("parseJson(JSON.stringify(" + escapedJson + "))");
关于javascript - 如何转义 JSON 对象以提供给 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066456/