首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么WebView.evaluateJavascript()要删除转义字符?

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

Stack Overflow用户
提问于 2018-05-29 19:46:40
回答 1查看 1.7K关注 0票数 2

我有一个字符串形式的JSON对象,我想把它作为字符串传递到我的WebView中。如果我的JSON字符串是一个简单的单级JSON,如下所示:

代码语言:javascript
复制
JSONObject object = new JSONObject;
object.put("key1", "val1");
object.put("key2", "val2");
String myValue = object.toString();

我像这样运行evaluateJavascript

代码语言:javascript
复制
webView.evaluateJavascript("console.log('" + myValue + "')", null)

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

代码语言:javascript
复制
{"key1": "val1", "key2", "val2"}

这是正确的。

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

代码语言:javascript
复制
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语句,我会得到以下控制台日志

代码语言:javascript
复制
{"key1":"val1", "key2": "{"key3": "val3"}"}

这可不是我想要的!我期望得到这样的输出:

代码语言:javascript
复制
{"key1":"val1", "key2": "{\"key3\": \"val3\"}"}

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

我甚至在将myValue传递给evaluateJavascript之前使用了一个调试器来检查它的运行时值,它看起来就像它应该的样子:

代码语言:javascript
复制
"{"key1":"val1", "key2": "{\"key3\": \"val3\"}"}"

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

注意:

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

代码语言:javascript
复制
myValue.replace("\\", "\\\\")

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-31 18:28:30

您可以在使用javascript接口的同时使用URLEncode对内容进行编码。

代码语言:javascript
复制
URLEncoder.encode(contents, "UTF-8");

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

代码语言:javascript
复制
decodeURIComponent(contents.replace(/\+/g, '%20'));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50583609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档