49

我想在 Zepto 或 Jquery 中使用 $.ajax 发布一组对象。两者都表现出相同的奇怪错误,但我找不到我做错了什么。

当使用像“RestEasy”这样的测试客户端发送数据时,数据会保存到服务器,我可以看到请求在浏览器的网络面板中被破坏,所以我相信 JS 是罪魁祸首。

如果我将对象数组作为 POST 的数据属性发送,则它们不会被正确发送。

数据对象:

var postData = [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]

要求:

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: postData
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});

在浏览器中看到的请求正文:

"bob=undefined&jonas=undefined"

这可以通过使用 jQuery 和 Zepto 用于准备 POST 数据的 $.param 方法更直接地看到。

$.param(
  [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]
)
// Output: "bob=undefined&jonas=undefined"

因此,这些库为复杂的帖子数据所做的准备似乎与我预期的不同。

我看到了这个答案,但我不想将数据作为查询参数发送,因为我要发布大量内容。 如何使用 jQuery 在 .ajax 帖子中发送数组?

使用 jQuery/Zepto 通过 POST 发送多个对象的正确方法是什么?

使用 $.ajax({... data: JSON.stringify(postData) ...}) 发送未损坏的内容,但服务器不喜欢这种格式。

更新: 似乎 JSON.stringify 发送格式正确的内容。问题是服务器端对它想要的对象的结构非常非常具体。如果我从对象中添加或删除任何属性,它将使整个过程失败,而不是使用匹配的属性。这很不方便,因为使用服务器发送的内容作为视图模型很好,但是视图模型会改变。...仍在研究最佳解决方案。

4

5 回答 5

89

请务必stringify在发送之前。我过于依赖库,并认为它们会根据我发布的 contentType 正确编码,但他们似乎没有。

作品:

$.ajax({
    url: _saveAllDevicesUrl
,   type: 'POST'
,   contentType: 'application/json'
,   data: JSON.stringify(postData) //stringify is important
,   success: _madeSave.bind(this)
});

我更喜欢这种方法而不是使用像 $.toJSON 这样的插件,尽管它确实完成了同样的事情。

于 2012-06-25T15:09:17.910 回答
17

尝试以下操作:

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: {'myArray': postData}
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});
于 2012-06-19T21:54:00.173 回答
5

编辑:我想现在使用本机JSON.stringify()方法开始安全了,大多数浏览器都支持(是的,如果你想知道的话,甚至是 IE8+)。

很简单:

JSON.stringify(yourData)

在发送数据之前,您应该在 JSON 中对数据进行编码,您不能只将这样的对象作为 POST 数据发送。

我建议使用jQuery json 插件来执行此操作。然后你可以在 jQuery 中使用这样的东西:

$.post(_saveDeviceUrl, {
    data : $.toJSON(postData)
}, function(response){
    //Process your response here
}
);
于 2012-06-19T21:46:21.690 回答
2

检查这个发布不同类型数组的示例

function PostArray() {
    var myObj = [
        { 'fstName': 'name 1', 'lastName': 'last name 1', 'age': 32 }
      , { 'fstName': 'name 2', 'lastName': 'last name 1', 'age': 33 }
    ];

    var postData = JSON.stringify({ lst: myObj });
    console.log(postData);

    $.ajax({
        type: "POST",
        url: urlWebMethods + "/getNames",
        data: postData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            alert(response.d);
        },
        failure: function (msg) {
            alert(msg.d);
        }
    });
}

如果在 C# 中使用 WebMethod,您可以像这样检索数据

[WebMethod]
    public static string getNames(IEnumerable<object> lst)
    {
        string names = "";
        try
        {
            foreach (object item in lst)
            {
                Type myType = item.GetType();
                IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

                foreach (PropertyInfo prop in props)
                {
                    if(prop.Name == "Values")
                    {
                        Dictionary<string, object> dic = item as Dictionary<string, object>;
                        names += dic["fstName"];
                    }
                }
            }
        }
        catch (Exception ex)
        {
             names = "-1";
        }
        return names;
    }

将带有 $.ajax 的对象数组 POST 到 C# WebMethod 中的示例

于 2019-01-11T11:33:26.350 回答
0

当我在 django 中接收由 ajax 发送的对象数组时,我遇到了同样的问题。JSONStringyfy 为我工作。你可以看看这个。

首先,我将数据字符串化为

var myData = [];
   allData.forEach((x, index) => {
         // console.log(index);
         myData.push(JSON.stringify({
         "product_id" : x.product_id,
         "product" : x.product,
         "url" : x.url,
         "image_url" : x.image_url,
         "price" : x.price,
         "source": x.source
      }))
   })

然后我像这样发送它

$.ajax({
        url: '{% url "url_name" %}',
        method: "POST",
        data: {
           'csrfmiddlewaretoken': '{{ csrf_token }}',
           'queryset[]': myData
        },
        success: (res) => {
        // success post work here.
    }
})

并收到:

list_of_json = request.POST.getlist("queryset[]", [])
list_of_json = [ json.loads(item) for item in list_of_json ]
于 2020-08-23T07:32:52.313 回答