0

json から値を取得する必要があります。返されたオブジェクトで完全に機能しますが、ブール値のように json 値だけを取得することがあります。そして、GWT で返された json から取得できません。

GWT チュートリアルの StockWatcher と同じように、json を取得するための JSNI 関数 getJson() があります。これは、返された文字列が 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 文字列は次のようになります。タイムアウトするまでに長い時間がかかります。だから私は、 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 に答える