2011-11-14 92 views
0

我需要從json獲取價值。它對返回的對象完美地工作,但有時我只得到json值 - 就像布爾值。而且我無法從GWT中返回的json中獲取它。GWT - 如何處理返回的Json作爲原始類型

我有JSNI函數getJson()用於檢索與GWT教程StockWatcher相同的json。我想這是該函數的相關部分,返回的字符串轉換爲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語句來決定返回哪個值類型來調用哪個處理函數。也許從這裏返回的值創建對象,然後將其添加到現有的處理程序。但我不確定如何正確執行此操作。 我試圖爲布爾創建overlayType,但它沒有幫助,因爲無論如何返回的字符串不會被解析爲jso。

感謝您的任何幫助。

回答

0

純原始類型不是有效的JSON。 JSON字符串(as defined here)必須是JavaScript對象或數組。如果不能改變服務從該原語類型來了可以墊含有原始類型,使得它們可以被解析(成一個單一的元件陣列)的字符串:

function padPrimitiveType(json) { 
    if (json != null && json[0] != '[' && json[0] != '{') { 
    return "[" + json + "]"; 
    } else { 
    return json; 
    } 
} 
相關問題