У меня есть строковый объект 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
.