2010-09-08 106 views
0

一些信息 - 我正在創建一個自動完成,它從json訂閱源獲取數據。 JSON部分工作正常,結果是有效的。如何在沒有jQuery的情況下解析JSON

當我獲得它時,我使用json2.js並運行JSON.parse。當我嘗試輸出時,它告訴我它(包含解析的JSON文本的對象)實際上是未定義的。

如果我運行對象的警報,然後輸出它的作品。這可能很簡單。但是,這是混亂,因爲它工作正常,如果我提醒對象

我知道它不會在一切工作,我只是想讓它現在工作,我會改進它。

謝謝,如果有任何更多的信息,我可以提供我會的。

代碼

//sURL takes a search term that's passed into the function 

var JSON_object = {}; 
var oRequest = new XMLHttpRequest(); 
var sURL = "datalinkhere"+input.value; 

oRequest.open("GET",sURL,true); 
oRequest.setRequestHeader("User-Agent",navigator.userAgent); 
oRequest.onreadystatechange = function() { 
    if (oRequest.readyState == 4 && oRequest.status == 200) 
    { 
     JSON_object = JSON.parse(oRequest.responseText); 
    } 
}; 
oRequest.send(null); 

suggestion(JSON_object,input); 

function suggestion(inp,targetid) 
{ 
    document.getElementById('autosuggest').style.display='block'; 
    document.getElementById('autosuggest').innerHTML=inp[1].namefield; 
} 
+0

順便說一下,狀態不僅可以是200.例如,如果數據將從本地緩存中獲取,並且服務器會確認數據未發生更改,則可以修改值304(未修改)(參見10.3。 5 http://www.ietf.org/rfc/rfc2616)。 – Oleg 2010-09-08 11:11:06

回答

2

問題不在於提醒json或不是您的代碼的概念。 Ajax請求異步工作,因此您的oRequest.send調用在數據加載之前不會阻塞,數據將在後臺加載。

所以你可以有運氣和數據可用於下一行(建議調用)和你的代碼工作,或者你會得到一個未定義的變種。

您必須異步編寫代碼:將建議調用直接放在JSON.parse-call之後,所有這些都將像魅力一樣工作。

+0

謝謝你們兩位。托比亞斯,它排序它。非常感謝你,我會在5分鐘內接受答案。 – Paul 2010-09-08 10:53:17

1

嘗試 JSON_OBJECT = EVAL(oRequest.responseText);

+3

'eval()'幾乎總是一個壞主意。 – 2010-09-08 10:54:39

+0

@Ignacio - 在沒有本機JSON支持的瀏覽器中(現在仍然是大部分),如何在不使用'eval()'的情況下加載JSON對象? – Andrew 2010-09-08 11:04:20

+1

@Andrew:用json2.js。 – 2010-09-08 12:14:26

2

你可能會感興趣的是jQuery的使用功能:

parseJSON: function(data) { 
    if (typeof data !== "string" || !data) { 
     return null; 
    } 

    // Make sure leading/trailing whitespace is removed (IE can't handle it) 
    data = jQuery.trim(data); 

    // Make sure the incoming data is actual JSON 
    // Logic borrowed from http://json.org/json2.js 
    if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { 

     // Try to use the native JSON parser first 
     return window.JSON && window.JSON.parse ? 
      window.JSON.parse(data) : 
      (new Function("return " + data))(); 

    } else { 
     jQuery.error("Invalid JSON: " + data); 
    } 
} 

有一對夫婦中就有jQuery方法,即修剪和錯誤,你可以找出它們是什麼閱讀源:http://code.jquery.com/jquery-1.4.2.js

有趣的是這一點:

// Try to use the native JSON parser first 
return window.JSON && window.JSON.parse ? 
    window.JSON.parse(data) : 
    (new Function("return " + data))(); 

它讀取JSON不使用eval一種巧妙的方法 - 建立該retur功能數據。

+0

Function構造函數仍然使用eval結束。我真的不知道這種自我調用功能的好處是什麼... – 2010-09-08 15:21:27

+0

嗯,我不是100%肯定...我會發現並張貼在這裏。 – 2010-09-08 17:07:37

+0

Ah:在Firefox中,函數('return'+ data)()在eval中的速度也要快很多 在包含1000個名稱和地址的JSON數據的測試用例中(約 112KB),eval在Firefox 3上執行我的機器。在 所有其他瀏覽器(包括IE!)幾乎不需要任何時間 功能版本在Firefox中幾乎不佔用時間(未在其他瀏覽器中測試它 。 )「(http://groups.google.com/group/jquery-dev/browse_thread/thread/f441058133cf07be/) – 2010-09-08 17:21:23

0

要做到這一點的最佳JavaScript是JSON.parse功能從json2.js您可以從http://www.json.org/js.html下載。它是最正式的版本的JSON.parseJSON.stringify。順便說一下,實現將檢查Web瀏覽器是否具有這些功能的內部實現,並在存在的情況下使用它們。

相關問題