Javascript 在WebView中从loadUrl解析JSON时出现语法错误
我将JSON从Java传递到WebView,如下所示:Javascript 在WebView中从loadUrl解析JSON时出现语法错误,javascript,android,Javascript,Android,我将JSON从Java传递到WebView,如下所示: JSONObject _res = new JSONObject(response); webView.loadUrl("javascript:receive('"+url+"', '"+_res.toString()+"')"); 在JavaScript中,我有一个相应的函数: function receive(url, data){ if(_callbacks[url] && data){ _c
JSONObject _res = new JSONObject(response);
webView.loadUrl("javascript:receive('"+url+"', '"+_res.toString()+"')");
在JavaScript中,我有一个相应的函数:
function receive(url, data){
if(_callbacks[url] && data){
_callbacks[url](JSON.parse(data));
delete _callbacks[url];
hideSpinner();
}
}
JS中的JSON.parse()会因“Web控制台”而失败﹕ 未捕获的语法错误:意外标记非法”。
这可能是编码问题吗?我还确信提供的JSON字符串是有效的
下面是一个来自LogCat的调用示例:
javascript:receive('mm://content/%7B%22id%22%3A%22test%22%2C%22city_id%22%3A0%7D', '{"title":"test","body":"<p>Foo<\/p>\r\n<p>Bar<\/p>","menu":[]}')
根据我的说法,在你的情况下,你应该双倍逃离CR和LF。
JSON.parse('{“title”:“test”,“body”:“Foo\\r\\nBar”,“menu”:[]}”)
我不知道用java做什么,但在从服务器发送之前,你应该找到一种方法来摆脱这些限制。这是一个古老的问题,但上面的答案没有帮助 答案来自“developer.android”的帮助并不总是容易理解的,因此对于这种情况,使用loadUrl在webview上将json对象从Java传递到javascript的问题的正确答案是:
JSONObject _res = new JSONObject(response);
String url = "mm://content/%7B%22id%22%3A%22test%22%2C%22city_id%22%3A0%7D";
class WebAppInterface {
@JavascriptInterface
public String Get_res_toString() {
return _res.toString();
}
@JavascriptInterface
public String Get_url() {
return url;
}
}
webview.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebAppInterface(), "Android");
webView.loadUrl("javascript:receive(Android.Get_url(), Android.Get_res_toString())");
js端接收到的字符串将与logcat上打印的字符串相同,并且在解析时不会抛出任何“错误”(当然,只要正确创建了json对象)
更多关于如何工作的信息。与其通过loadUrl将数据传递给JavaScript,不如使用loadUrl调用Android端的另一个函数,该函数可以将数据返回到JavaScript。解析非常严格,您的JSON字符串可能是有效的,但您可以与我们分享一个示例,因为这正是它抛出错误的地方
JSONObject _res = new JSONObject(response);
String url = "mm://content/%7B%22id%22%3A%22test%22%2C%22city_id%22%3A0%7D";
class WebAppInterface {
@JavascriptInterface
public String Get_res_toString() {
return _res.toString();
}
@JavascriptInterface
public String Get_url() {
return url;
}
}
webview.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebAppInterface(), "Android");
webView.loadUrl("javascript:receive(Android.Get_url(), Android.Get_res_toString())");