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

时间:2018-05-29 11:46:40

标签: 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)。这样,神秘的剥离将删除一个转义字符,但将另一个转义为允许我成功 function isEmail(email) { var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; return regex.test(email); } $("#submit").click(function() { alert(isEmail($("#email").val())); });它。

1 个答案:

答案 0 :(得分:1)

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

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

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

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