Javascript 在没有jQuery的情况下如何解析JSON

Javascript 在没有jQuery的情况下如何解析JSON,javascript,json,Javascript,Json,一些信息-我正在创建一个从json提要获取数据的自动完成。JSON部分工作正常,结果有效 当我获取它时,我使用json2.js并运行JSON.parse。当我尝试输出时,它告诉我它(包含已解析JSON文本的对象)实际上是未定义的 如果我在对象上运行一个警报,然后输出,它就会工作。这可能很简单。但这是一个让人困惑的地方,因为如果我提醒这个对象,它可以正常工作 我知道它不会对所有事情都起作用,我现在只是想让它起作用,我会改进它 谢谢你,如果我能提供更多的信息,我会的 代码 //sURL takes

一些信息-我正在创建一个从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;
}
试一试 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()
本身——只需处理清理数据的复杂性。伊普