0

我需要从 json 中获取价值。它适用于返回的对象,但有时我只得到 json 值——比如布尔值。而且我无法从 GWT 中返回的 json 中获取它。

我有 JSNI 函数 getJson() 用于检索与 GWT 教程 StockWatcher 相同的 json。我想这是该函数的相关部分,返回的字符串在哪里转换为 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。

谢谢你的帮助。

4

1 回答 1

0

裸原始类型不是有效的 JSON。JSON 字符串(如此处定义)必须是 JavaScript 对象或数组。如果您无法更改原始类型来自的服务,您可以填充包含原始类型的字符串,以便可以解析它们(到单个元素数组中):

function padPrimitiveType(json) {
  if (json != null && json[0] != '[' && json[0] != '{') {
    return "[" + json + "]";
  } else {
    return json;
  }
}
于 2011-11-14T17:41:07.083 回答