Javascript 在没有jQuery的情况下如何解析JSON
一些信息-我正在创建一个从json提要获取数据的自动完成。JSON部分工作正常,结果有效 当我获取它时,我使用json2.js并运行JSON.parse。当我尝试输出时,它告诉我它(包含已解析JSON文本的对象)实际上是未定义的 如果我在对象上运行一个警报,然后输出,它就会工作。这可能很简单。但这是一个让人困惑的地方,因为如果我提醒这个对象,它可以正常工作 我知道它不会对所有事情都起作用,我现在只是想让它起作用,我会改进它 谢谢你,如果我能提供更多的信息,我会的 代码Javascript 在没有jQuery的情况下如何解析JSON,javascript,json,Javascript,Json,一些信息-我正在创建一个从json提要获取数据的自动完成。JSON部分工作正常,结果有效 当我获取它时,我使用json2.js并运行JSON.parse。当我尝试输出时,它告诉我它(包含已解析JSON文本的对象)实际上是未定义的 如果我在对象上运行一个警报,然后输出,它就会工作。这可能很简单。但这是一个让人困惑的地方,因为如果我提醒这个对象,它可以正常工作 我知道它不会对所有事情都起作用,我现在只是想让它起作用,我会改进它 谢谢你,如果我能提供更多的信息,我会的 代码 //sURL takes
//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;
}
试一试
JSON_object=eval(oRequest.responseText) 试试看
JSON_object=eval(oRequest.responseText) 问题在于是否没有提醒json,这是代码的概念。Ajax请求是异步工作的,因此您的oRequest.send调用不会阻塞,直到数据加载完毕,数据在后台加载 因此,当下一行(建议调用)和您的代码工作时,或者您将获得一个未定义的var时,您就可以幸运地看到数据
您必须异步编写代码:将建议调用直接放在JSON.parse-call之后,所有调用都会像一个符咒一样工作。问题在于是否没有提醒JSON,这是您代码的概念。Ajax请求是异步工作的,因此您的oRequest.send调用不会阻塞,直到数据加载完毕,数据在后台加载 因此,当下一行(建议调用)和您的代码工作时,或者您将获得一个未定义的var时,您就可以幸运地看到数据
您必须异步编写代码:将建议调用直接放在JSON.parse-call之后,所有调用都会非常有效。您可能对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方法,即trim和error,您可以通过阅读源代码来了解它们:
有趣的是这一点:
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
这是一种在不使用eval的情况下读取JSON的简洁方法—设置一个返回数据的函数。您可能对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方法,即trim和error,您可以通过阅读源代码来了解它们:
有趣的是这一点:
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
这是一种不使用eval读取JSON的简洁方法——设置一个返回数据的函数。最好的JavaScript是json2.js中的
JSON.parse
函数,您可以从下载该函数。它是JSON.parse
和JSON.stringify
的最官方版本。顺便说一句,实现将检查web浏览器是否有这些函数的内部实现,并在存在的情况下使用它们。最好的JavaScript是JSON.JSON中的parse
函数,您可以从下载。它是JSON.parse
和JSON.stringify
的最官方版本。顺便说一句,实现将检查web浏览器是否具有这些功能的内部实现,如果存在,则使用这些功能。谢谢。托比亚斯,那就对了。非常感谢,如果允许的话,我会在5分钟内接受答案。谢谢你们。托比亚斯,那就对了。非常感谢,如果允许的话,我将在5分钟内接受答案。eval()
几乎总是一个坏主意。@Ignacio-在一个没有原生JSON支持的浏览器中(目前仍然是大多数浏览器),如果不使用eval()
,您如何加载JSON对象?当然,您可以使用eval
解析JSON。是的,如果它包含任意JavaScript而不是JSON值,您将遇到麻烦,但是如果您的服务器返回的是不可靠的JavaScript,那么您将需要担心更严重的安全问题。但是如果您确实使用了eval
,则需要将responseText
括在括号中(以避免对象文本被解析为块),并用转义符替换出现的任何字符U+2028和U+2029,因为它们在JSON中有效,但在JS字符串文本中无效<代码>求值('('+responseText.split('\u2028').join('\\u2028').split('\u2029').join('\\u2029')+')))@bobince-完全正确。eval()
中没有固有的危险,但是如何使用它来接受第三方数据。JSON2.js——它使用eval()
本身——只需处理清理数据的复杂性。我个人认为,如果您自己控制并生成数据,那么使用eval()
就没有风险。我同意。显然,您应该使用原生的JSON。如果存在,请首先解析,只使用eval
作为备用。eval()
几乎总是一个坏主意。@Ignacio-在没有原生JSON支持的浏览器中(目前仍然是大多数浏览器),如果不使用eval(),您如何加载JSON对象
?当然,您可以使用eval
解析JSON。是的,如果它包含任意JavaScript而不是JSON值,您将遇到麻烦,但是如果您的服务器返回的是不可靠的JavaScript,那么您将需要担心更严重的安全问题。但是如果您确实使用了eval
,则需要将responseText
括在括号中(以避免对象文本被解析为块),并用转义符替换出现的任何字符U+2028和U+2029,因为它们在JSON中有效,但在JS字符串文本中无效<代码>求值('('+responseText.split('\u2028').join('\\u2028').split('\u2029').join('\\u2029')+')))
@bobince-完全正确。eval()
中没有固有的危险,但是如何使用它来接受第三方数据。JSON2.js——它使用eval()
本身——只需处理清理数据的复杂性。伊普