首页 > 解决方案 > 为什么 WebView.evaluateJavascript() 会删除转义字符?

问题描述

我有一个字符串化的 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 的引号应该被转义。如果它们没有被转义,那么尝试对其运行 aJSON.parse将导致解析错误。

我什至使用调试器来检查myValue它被传入之前的运行时间值,evaluateJavascript它看起来应该是这样的:

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

那么为什么跑步会evaluateJavascript神秘地去掉那些显式的转义符号呢?

笔记:

我可以解决这个问题的唯一方法是在之前运行以下语句evaluateJavascript

myValue.replace("\\", "\\\\")

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

标签: androidjsonandroid-webview

解决方案


您可以在使用 javascript 界面时使用 URLEncode 对内容进行编码。

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

然后为了取回 js 中的实际内容,您可以使用

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

推荐阅读