javascript - 如何转义 JSON 对象以提供给 JavaScript 函数?

标签 javascript android ios json xamarin

真的很纠结这个问题!我正在构建一个显示 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/

相关文章:

javascript - 如何在 JavaScript 中设置目标文件夹

javascript - 如何通过在 Fabricjs 中单击图像来删除图像?

android - ViewPager 不支持 layout_height = wrap_content

java - 为什么原生 libmpg123 在带有 libgdx 的 Android 上花费这么长时间?

android - WebRTC : gclient runhooks not working

ios - 使用 MagicalRecord 导入数据

javascript - 为什么不在数组中添加元素?

javascript - 更新 jquery 后文件上传不起作用

iphone - 在Core Plot中绘制折线图的简单方法?

ios - 更改 ViewController Swift 的背景颜色? (单 View 应用程序)