我需要从json获得价值。它完全适用于返回的对象,但有时我只得到json值 - 就像布尔值。我无法从GWT中返回的json中获取它。
我有JSNI函数getJson()用于检索json,与GWT教程StockWatcher相同。我想这是该函数的相关部分,返回的字符串转换为JavaScriptObject?
// [2] Define the callback function on the window object.
window[callback] = function(jsonObj) {
// [3]
handler.@cz.metacentrum.perun.webgui.json.JsonClient::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(jsonObj);
window[callback + "done"] = true;
}
// [4] JSON download has a timeout.
setTimeout(
function() {
if (!window[callback + "done"]) {
handler.@cz.metacentrum.perun.webgui.json.JsonClient::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(null);
}
// [5] Cleanup. Remove script and callback elements.
document.body.removeChild(script);
delete window[callback];
delete window[callback + "done"];
}, timeout);
它调用处理函数,它也基于教程。
public void handleJsonResponse(JavaScriptObject jso){
// if an ERROR
if (jso == null) {
this.module.onError();
return;
}
// OK
this.module.onFinished(jso);
}
问题是。当我收到布尔值时,它不会被解析为JavaScriptObject,而我最终会因超时而导致onError()。
返回的json字符串如下所示:callback5(true);并且它在超时之前返回了很长时间。所以我认为,getJson()只是无法解析它?
如何将其解析为JavaScriptObject以与我的其余程序一起使用?我想我需要在getJson()的第[3]节中使用一些IF语句来决定返回什么值类型以及要调用的处理函数。也许在这里从返回值创建对象,然后将其变为现有的处理程序。但我不确定如何做到核心。 我试图为布尔值创建overlayType,但它没有任何帮助,因为无论如何返回的字符串都不会被解析为jso。
感谢您的帮助。
答案 0 :(得分:0)
裸基本类型不是有效的JSON。 JSON字符串(as defined here)必须是JavaScript对象或数组。如果您无法更改基本类型所来自的服务,您可以填充包含基本类型的字符串,以便可以解析它们(到单个元素数组中):
function padPrimitiveType(json) {
if (json != null && json[0] != '[' && json[0] != '{') {
return "[" + json + "]";
} else {
return json;
}
}