У меня есть функция JavaScript
, в которой используется парсер JSON
:
function myFunction(jobj) {
jobj = JSON.parse(jobj);
console.info("jobj: ", jobj);
}
У меня есть 2 приложения (одно приложение Visual Studio C# и одно приложение Android Studio) с WebView "myWebView", где я вызываю функцию JavaScript "myFunction":
Код на С#
JObject jobj = new JObject();
jobj.Add("id", "testId");
jobj.Add("value", "1234");
String json = jobj.ToString(Newtonsoft.Json.Formatting.None, null);
String[]jsonArray = new String[] { json };
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => await myWebView.InvokeScriptAsync("myFunction", jsonArray));
Код в Android:
JSONObject jsonObj = new JSONObject();
jsonObj.put("id", "testId");
jsonObj.put("value", "1234");
String json = jsonObj.toString();
String[]jsonArray = new String[] { json };
myWebView.loadUrl("javascript:myFunction('" + jsonArray + "')");
В С# работает нормально.
Но в Android, когда я делаю синтаксический анализ, я получаю сообщение об ошибке:
Uncaught SyntaxError: Unexptected token L in JSON at position 1
Спасибо, с уважением Фил
В Android вы используете Java. Когда вы используете оператор конкатенации в Java, операнд превращается в строку. Однако вы объединяете jsonArray
, который является массивом, а строковое представление массивов загадочно. Например, new String[] { "foo", "bar" };
записывается как "[Ljava.lang.String;@2a139a55"
, нет["foo", "bar"]
, как это было бы в большинстве разумных языков. Вы можете заменить jsonArray
там на
"[" + String.join(", ", jsonArray) + "]"
Спасибо за информацию. Теперь я использую строку, а не String[] для функции: myWebView.loadUrl("javascript:myFunction('" + json + "')"); это работает для меня
покажи свой json?