从 JQuery.ajax 成功数据中解析 JSON

Posted

技术标签:

【中文标题】从 JQuery.ajax 成功数据中解析 JSON【英文标题】:Parse JSON from JQuery.ajax success data 【发布时间】:2011-07-14 10:18:26 【问题描述】:

我无法从 JQery.ajax 调用中获取 JSON 对象的内容。我的电话:

$('#Search').click(function () 
    var query = $('#query').valueOf();
    $.ajax(
        url: '/Products/Search',
        type: "POST",
        data: query,
        dataType: 'application/json; charset=utf-8',
        success: function (data) 
            alert(data);
            for (var x = 0; x < data.length; x++) 
                content = data[x].Id;
                content += "<br>";
                content += data[x].Name;
                content += "<br>";
                $(content).appendTo("#ProductList");
               // updateListing(data[x]);
            
        
    );
);

似乎正确返回了 JSON 对象,因为“alert(data)”显示以下内容

["Id": "1", "Name": "Shirt", "Id": "2", "Name":"Pants"]

但是当我尝试使用以下方式向页面显示 ID 或名称时:

content = data[x].Id;
content += "<br>";
content += data[x].Name;
content += "<br>";

它向页面返回“未定义”。我做错了什么?

感谢您的帮助。

【问题讨论】:

文档有帮助。 api.jquery.com/jQuery.ajax 表明 'application/json; charset=utf-8' 不是 dataType 的有效值。 通过JSON.parse()转成json 【参考方案1】:

数据以 JSON 的字符串表示形式返回,您没有将其转换回 javascript 对象。将 dataType 设置为 'json' 以使其自动转换。

【讨论】:

@DipakYadav:getJSON 不会发布。 @MarceloCantos(关于您的回答):这是真的。然而,根据jQuery Manual,“任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝”。因此,您只能使用dataType: 'json',如果您确定,该服务器将返回格式正确的 JSON。如果它只返回“a string, that looks like JSON”,你应该使用dataType: "text json"来强制jQuery转换。 header('Content-Type: application/json');如果您使用的是 php【参考方案2】:

我建议你使用:

var returnedData = JSON.parse(response);

将 JSON 字符串(如果只是文本)转换为 JavaScript 对象。

【讨论】:

@RyanGates 我相信,如果我没记错的话,abobreshov 说的是简单的success: function (data) data = JSON.parse(data);【参考方案3】:

效果很好, 例如:

$.ajax(
    url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران",
    type: 'GET',
    cache: false,
    success: function(result) 
        //  alert(jQuery.dataType);
        if (result) 
            //  var dd = JSON.parse(result);
            alert(result[0].Id)
        

    ,
    error: function() 
        alert("No");
    
);

最后,你需要使用这个语句...

result[0].Whatever

【讨论】:

【参考方案4】:

确保不会发生此类错误(使用字符串而不是 json)的方法之一是查看alert 中打印的内容。当你这样做时

alert(data)

如果 data 是一个字符串,它将打印包含的所有内容。但是,如果您打印的是 json 对象。您将在警报中收到以下响应

[object Object]

如果这是响应,那么您可以确定您可以将其用作对象(在本例中为 json)。

因此,在使用它之前,您需要先将字符串转换为 json:

JSON.parse(data)

【讨论】:

【参考方案5】:

嗯...您大约是那里的 3/4...您已经将 JSON 作为文本。

问题是您似乎在处理这个字符串,就好像它已经是一个 JavaScript 对象,其属性与传输的字段相关。

它不是……它只是一个字符串。

像“content = data[x].Id;”这样的查询肯定会失败,因为 JavaScript 没有找到附加到它正在查看的字符串的这些属性......再次,它只是一个字符串。

您应该能够通过...是的... JSON 对象的 parse 方法简单地将数据解析为 JSON。

myResult = JSON.parse(request.responseText);

现在 myResult 是一个 javascript 对象,其中包含通过 AJAX 传输的属性。

这应该可以让你按照你想要的方式处理它。

看起来 JSON.parse 是在添加 ECMA5 时添加的,所以任何相当现代的东西都应该能够本地处理这个......如果你必须处理化石,你也可以尝试外部库来处理这个,例如 @987654321 @ 或JSON2。

郑重声明,Andy E 已经为其他人 HERE 回答了这个问题。

edit - 看到“官方或可信来源”的请求,我认为最可信的编码人员之一可能是 John Resig ~ ECMA5 JSON ~ 我会链接到关于原生 JSON 支持的实际 ECMA5 规范,但我宁愿将某人推荐给像 Resig 这样的大师,而不是枯燥的规范。

【讨论】:

我认为真正的问题是:为什么$.ajax() 不转换它?【参考方案6】:

尝试使用 jquery each 函数来遍历您的 json 对象:

$.each(data,function(i,j)
    content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>';
    $('#ProductList').append(content);
);

【讨论】:

【参考方案7】:

你可以使用 jQuery parseJSON 方法:

var Data = $.parseJSON(response);

【讨论】:

【参考方案8】:

输入类型按钮

<input type="button" Id="update" value="Update">

我已经成功地在 perl 中发布了一个带有 AJAX 的表单。发布表单后,控制器返回如下 JSON 响应

$(function() 

    $('#Search').click(function() 
        var query = $('#query').val();
        var update = $('#update').val();

        $.ajax(
            type: 'POST',
            url: '/Products/Search/',
            data: 
                'insert': update,
                'query': address,
            ,
            success: function(res) 
                $('#ProductList').empty('');
                console.log(res);
                json = JSON.parse(res);
                for (var i in json) 
                    var row = $('<tr>');
                    row.append($('<td id=' + json[i].Id + '>').html(json[i].Id));
                    row.append($('<td id=' + json[i].Name + '>').html(json[i].Name));
                    $('</tr>');
                    $('#ProductList').append(row);
                
            ,
            error: function() 
                alert("did not work");
                location.reload(true);
            
        );
    );
);

【讨论】:

【参考方案9】:

来自 jQuery API:使用dataType 的设置,如果没有指定,jQuery 将尝试根据 MIME 类型使用$.parseJSON() 推断它(JSON 文本的 MIME 类型为“application/json”)响应(在 1.4 JSON 将产生一个 JavaScript 对象)。 或者您可以将dataType 设置为json 以自动转换。

【讨论】:

【参考方案10】:

我不确定您的设置出了什么问题。也许服务器没有正确设置标题。不确定。作为一个长镜头,你可以试试这个

$.ajax(
    url : url,
    dataType : 'json'
)
.done(function(data, statusText, resObject) 
   var jsonData = resObject.responseJSON
)

【讨论】:

【参考方案11】:

解析并转换成js对象就可以了。

success: function(response) 
    var content = "";
    var jsondata = JSON.parse(response);
    for (var x = 0; x < jsonData.length; x++) 
        content += jsondata[x].Id;
        content += "<br>";
        content += jsondata[x].Name;
        content += "<br>";
    
    $("#ProductList").append(content);

【讨论】:

以上是关于从 JQuery.ajax 成功数据中解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 不会从 AJAX 查询中解析我的 JSON

从 jquery ajax 成功数据中获取 css this 和 value 选择器

防止图像在非 DOM jQuery AJAX 解析上加载

如何使用 jQuery 和 ASP.NET MVC 从 AJAX 调用返回错误消息?

jQuery $.ajax(),将成功数据传递给单独的函数

从图像响应中设置 jQuery ajax 成功中的 div 背景