一些信息 - 我正在创建一个自动完成功能,它从json提要中获取数据。 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 :(得分:2)
问题不是警告json,而是代码的概念。 Ajax请求异步工作,因此在加载数据之前,oRequest.send调用不会阻塞,数据将在后台加载。
因此,当下一行(建议 - 调用)和您的代码正常工作或者您将获得未定义的var时,您可以获得运气并且数据可用。
你必须异步编写你的代码:在JSON.parse调用之后直接调用suggestion-call,所有这些都会像魅力一样工作。
答案 1 :(得分: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))();
这是一种不使用eval读取JSON的简洁方法 - 设置一个返回数据的函数。
答案 2 :(得分:1)
尝试 JSON_object = eval(oRequest.responseText);
答案 3 :(得分:0)
最好的JavaScript是来自json2.js的JSON.parse
函数,你可以从http://www.json.org/js.html下载。它是JSON.parse
和JSON.stringify
的最官方的版本。顺便说一下,实现将检查Web浏览器是否具有这些功能的内部实现,并在它们存在时使用它们。