Почему WebView.evaluateJavascript () удаляет управляющие символы? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть строковый объект 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 таинственным образом убирает эти явные escape-символы?

ПРИМЕЧАНИЕ:

Единственный способ решить эту проблему - выполнить следующую инструкцию непосредственно перед evaluateJavascript

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

, то есть заменить любые escape-символы (\) на 2 escape-символа (\\).Таким образом, таинственная зачистка удалит один escape-символ, но оставит другого там, что позволит мне успешно JSON.parse.

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать URLEncode для кодирования содержимого при использовании интерфейса javascript.

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

А затем для возврата фактического содержимого в js вы можете использовать

decodeURIComponent(contents.replace(/\+/g, '%20'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...