android - How to escape a JSON object to feed into a JavaScript function? -
really struggling one! i'm building android , iphone application shows webview
(uiwebview
on ios). webview
has html page loaded in contains simple javascript function defined follows:
function parsejson(input) { alert("start of parsejson(...) javascript method"); var parsedjson = json.parse(input); alert("end of parsejson(...) javascript method"); }
what want call parsejson(input)
javascript function android/ios client passing in string
input parameter. done follows xamarin.android:
string json = "{}" mywebview.loadurl ("javascript:parsejson(\"" + json + "\")"));
and follows xamarin.ios:
string json = "{}" mywebview.evaluatejavascript ("parsejson(\"" + json + "\")");
up here, works fine. no problem. javascript function called , executes. also, know have double-escape quotation-mark character in string
, follows:
string json = "{\\\"key\\\":\\\"value\\\"}";
this works fine. javascript function called , executes. double escaping "\r"
, "\n"
(to "\\\r"
, "\\\n"
) works. however, if json string contains "\\"
, "\b"
, "\t"
or "\f"
, json.parse(...)
call in javascript function falls on (even if character double-escaped).
any ideas on how can reliably escape json string within client before feed javascript function?
turns out have escape parameters fed javascript function follows:
string escapejavascriptfunctionparameter(string param) { char[] chars = param.tochararray(); stringbuilder sb = new stringbuilder (); (int = 0; < chars.length; i++) { switch (chars [i]) { case '\\': sb.append ("\\\\"); break; case '\n': sb.append ("\\n"); break; case '\r': sb.append ("\\r"); break; case '\b': sb.append ("\\b"); break; case '\f': sb.append ("\\f"); break; case '\t': sb.append ("\\t"); break; default: sb.append (chars[i]); break; } return sb.tostring (); }
this not complete escape method demonstrates how escape common javascript special characters.
using method, call javascript function android project follows:
string json = "{\"key\":\"value\"}"; string escapedjson = escapejavascriptfunctionparameter(json); mywebview.loadurl ("javascript:parsejson(json.stringify(" + escapedjson + "))");
and ios project follows:
string json = "{\"key\":\"value\"}"; string escapedjson = escapejavascriptfunctionparameter(json); mywebview.evaluatejavascript ("parsejson(json.stringify(" + escapedjson + "))");
Comments
Post a Comment