2011-11-14 4 views
0

jsonから値を取得する必要があります。それは返されたオブジェクトで完璧に動作しますが、時には私はちょうどブソン値のようなjson値を取得します。そして私はGWTで返されたjsonからそれを得ることができません。GWT - ハンドルがプリミティブ型としてJsonを返した方法

GWTチュートリアルStockWatcherと同じjsonを取得するためのJSNI関数getJson()があります。私はこれが返された文字列がJavaScriptObjectに変換される、その関数の関連する部分だと思いますか?

// [2] Define the callback function on the window object. 
     window[callback] = function(jsonObj) { 
      // [3] 
      [email protected]::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(jsonObj); 
      window[callback + "done"] = true; 
     } 
    // [4] JSON download has a timeout. 
     setTimeout(
       function() { 
        if (!window[callback + "done"]) { 
         [email protected]::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文を呼び出す必要があると思います。おそらくここで返された値から手動でオブジェクトを作成し、それを既存のハンドラに渡します。しかし、私はそれをどのようにして行うのかが分からない。 booleanのためにoverlayTypeを作成しようとしましたが、返された文字列はjsoとして解析されないため、助けにはなりません。

ありがとうございました。

答えて

0

裸のプリミティブ型は有効なJSONではありません。 JSON文字列(as defined here)は、JavaScriptオブジェクトまたは配列である必要があります。プリミティブ型が来るサービスを変更できない場合は、プリミティブ型を含む文字列をパディングして(単一の要素配列に)解析できるようにすることができます:

function padPrimitiveType(json) { 
    if (json != null && json[0] != '[' && json[0] != '{') { 
    return "[" + json + "]"; 
    } else { 
    return json; 
    } 
} 
関連する問題