我有一个字符串化的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界面​​时使用URLEncode对内容进行编码。

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


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

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

08-05 21:48
查看更多