android - 为什么 WebView.evaluateJavascript() 会删除转义字符?

标签 android json android-webview

我有一个字符串化的 JSON 对象,我想将其作为字符串传递到我的 WebView 中。如果我的 JSON 字符串是像这样的简单的一级 JSON:

JSONObject object = new JSONObject;
object.put("key1", "val1");
object.put("key2", "val2");
String myValue = object.toString();

然后我像这样运行 evaluateJavascript:

webView.evaluateJavascript("console.log('" + myValue + "')", null)

然后我得到的控制台日志是这样的:

{"key1": "val1", "key2", "val2"}

哪个是正确的。

但是如果我的 JSON 中有一个子 JSON,那么该 JSON 的字符串化版本应该在其中为该内部 JSON 转义引号。所以如果我这样做:

JSONObject object = new JSONObject();
object.put("key1", "val1");
JSONObject innerObject = new JSONObject();
innerObject.put("key3","val3");
object.put("key2", innerObject);
String myValue = object.toString();

然后运行上面相同的 evaluateJavascript 语句,我得到以下控制台日志

{"key1":"val1", "key2": "{"key3": "val3"}"}

这不是我所期待的!我期待这样的输出:

{"key1":"val1", "key2": "{\"key3\": \"val3\"}"}

内部 JSON 的引号应该被转义。如果它们未被转义,则尝试对其运行 JSON.parse 将导致解析错误。

我什至在 myValue 被传递到 evaluateJavascript 之前使用调试器检查它的运行时值,它看起来像它应该的样子:

"{"key1":"val1", "key2": "{\"key3\": \"val3\"}"}"

那么,为什么运行 evaluateJavascript 神秘地去除了那些显式转义符号?

注意:

我能解决这个问题的唯一方法是在 evaluateJavascript

之前运行以下语句
myValue.replace("\\", "\\\\")

也就是说,将任何转义字符 (\) 替换为 2 个转义字符 (\\)。这样,神秘的剥离将删除一个转义字符,但将另一个转义字符留在那里,这使我能够成功地 JSON.parse 它。

最佳答案

您可以在使用 javascript 接口(interface)时使用 URLEncode 对内容进行编码。

URLEncoder.encode(contents, "UTF-8");

然后你可以使用 js 取回实际内容

decodeURIComponent(contents.replace(/\+/g, '%20'));

关于android - 为什么 WebView.evaluateJavascript() 会删除转义字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583609/

相关文章:

Android 4.0 Webview 无法正常工作

Android SSLHandShakeException : Handschake failed on Android 6. 0.1

android - 在 Fragment 中使用 ViewModelFactory

android - 在 Android Studio 中添加 Overlap2D 库作为依赖项

android - getLastKnownLocation 崩溃 Android 2.1

python - 使用 json 格式化字符串

json - 在Windows Excel VBA中,如何获取JSON key 来抢占 "Run-time error ' 43 8': Object doesn' t支持此属性或方法”?

python - 如何在 Python 中从两个列表生成 json

Android 音频和视频无法在加载的 HTML 页面的 webview 上播放

android - 如何覆盖android webview os 4.1+的默认文本选择?