【问题标题】:Wrong javascript array serialization in ajax callajax 调用中错误的 javascript 数组序列化
【发布时间】:2014-07-08 13:06:44
【问题描述】:

我想在 ajax 调用中传递 javascript 对象数组。

我是这样制作数组的:

   var itemsToEdit = [];
   $(".editedItem[value='true']").closest("tr").each(function() {
      var itemToEdit = {
         id: $(this).find(".idInput").val(),
         name: $(this).find(".nameInput").val(),
         code: $(this).find(".codeInput").val()
      }; // Represents SomeClass java class with fields: id, name, code
      itemsToEdit.push(itemToEdit);
   });

然后做ajax调用:

   $.ajax({
      url: "MyActionBean.action?saveChanges",
      type: "Post",
      dataType: "json",
      data: itemsToEdit,
      success: function( data ) {
         alert("Oh, no");
      }
   });

问题是:在服务器端我收到地图列表,而不是 SomeClass 对象列表。 我检查了浏览器发送的内容,它是:

itemsToEdit[0][id]:4
itemsToEdit[0][name]:Florida
itemsToEdit[0][code]:FL
itemsToEdit[1][id]:3
itemsToEdit[1][name]:California
itemsToEdit[1][code]:CA

但我显然想要这个,因为我相信这是对 SomeClass 列表的正确映射:

itemsToEdit[0].id:4
itemsToEdit[0].name:Florida
itemsToEdit[0].code:FL
itemsToEdit[1].id:3
itemsToEdit[1].name:California
itemsToEdit[1].code:CA

我哪里错了?

(理解上下文可能不是重要的信息:我使用 Stripes 框架,它将请求中的参数映射到调用的 ActionBean 字段)

谢谢!

【问题讨论】:

  • itemsToEdit[0][id]:4 和 itemsToEdit[0].id:4 UM,它们的含义完全相同。括号和点符号。
  • 好的。但是 Stripes 框架不这么认为 :) 因为第一个变体是通过 stripes 映射到: private List> itemsToEdit;第二个变体:私有 List itemsToEdit;
  • 如果你将一个数组传递给data:,jQuery 几乎不会像你期望的那样做。您检查过您的 POST 请求的实际内容吗?
  • 是的。我在我的问题中指定了它。这是我的 POST 请求的实际内容:itemsToEdit[0][id]:4 ... 甚至,Stripes 框架确实将其映射到 List>。我在服务器端收到它。在 jQuery ajax 文档中,他们说你可以传递数组
  • @gs_vlad,你找到解决这个问题的方法了吗?我也遇到了同样的问题。

标签: javascript jquery ajax arrays stripes


【解决方案1】:

我可以看到一些可能会导致条纹脱落的事情。

  1. 虽然您现在发送的任何内容都不会导致问题,但您应该在您传递的数据上使用JSON.stringify()。

  2. AJAX 调用通常发送 JSON 对象,而不是数组。

尝试像这样发送和接收您的数组:

$.ajax({
    url: "MyActionBean.action?saveChanges",
    type: "Post",
    dataType: "json",
    data: {
        'items': JSON.stringify(itemsToEdit)
    },
    success: function( data ) {
       alert("Oh, no");
    }
});

另一方面,检索接收到的对象的items 属性并解析它而不是整个对象。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2013-08-08
    • 1970-01-01
    • 2017-01-25
    • 2012-12-07
    相关资源
    最近更新 更多