jQuery TypeError:将循环结构转换为JSON

时间:2014-05-15 11:53:26

标签: jquery

我有这个ajax函数,它发送一个数组参数并将其保存到db。它工作正常,因为它已在我们的项目中多次调用。

这是函数的快照:

function InsertProjectList(projectList, pageUrl, remark) {
    if (projectList.length === 0) return;
    $.ajax({
        type: "POST",
        url: "/StatsService.asmx/InsertListToProjectStats",
        data: "{ 'projectList': " + JSON.stringify(projectList) + ", 'pageUrl': '" + encodeURI(pageUrl) + "', 'remark': '" + escape(remark) + "' }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function () { },
        complete: function () { },
        success: function (data) {
        },
        error: function (a, b, c) {
        }
    });
}

但是后来我通过跟随jquery操作得到了这个projectlist,它确实返回了一个类似["195", "254", "784"]的数组,我希望在这种情况下我的ajax is unable发送list参数。我想知道这里有什么问题吗?浏览器控制台显示Uncaught TypeError: Converting circular structure to JSON.

var projectList = $("ul#plist .project-list").filter(':onScreen').map(function () {
    return $(this).attr("projectid");
});

InsertProjectList(projectList, $(location).attr("href"), remarkText[4]);

我知道我可以使用jQuery each函数来获取projectId这个数组,但这不是我的意图。

2 个答案:

答案 0 :(得分:0)

不要在data字段上加上引号,并尝试传递该对象而不对其进行字符串化。

而且我不认为你可以对一个数组进行字符串化(它看起来像一个数组,不是吗?)

function InsertProjectList(projectList, pageUrl, remark) {
    if (projectList.length === 0) return;
    $.ajax({
        type: "POST",
        url: "/StatsService.asmx/InsertListToProjectStats",
        data: { projectList: JSON.stringify(projectList)
              , pageUrl : encodeURI(pageUrl)
              , remark: escape(remark)
              },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function () { },
        complete: function () { },
        success: function (data) {
        },
        error: function (a, b, c) {
        }
    });
}

在这种情况下,您应该能够将对象(作为数组)传递给ajax请求。

答案 1 :(得分:0)

您的问题是您是从jQuery .map()函数返回的。它没有返回一个javascript数组,它返回一个有一个数组的jquery对象。因此JSON.stringify超过该对象无法工作,因此您拥有TypeError

var projectList = $("ul#plist .project-list").filter(':onScreen').map(function () {
    return $(this).attr("projectid");
}).get();

.get()会将您的.map()对象转换为javascript数组,然后您就可以JSON.stringify()了。