【问题标题】:Add additional array to serialized form data向序列化的表单数据添加额外的数组
【发布时间】:2020-06-29 17:07:55
【问题描述】:

我想做一个 ajax jquery 帖子。我已经序列化了表单数据,但我的端点需要将其他值添加到要一起发布的序列化表单数据中。

要追加到序列化表单数据的对象是

"bridgeConfigurations": [
    {
        "configName":"Provider_Account_Id",
        "configValue":"xxxxx"
    },
    {
    "configName":"Provider_Auth_Token",
    "configValue":"xxxxx"
    }
]

关于如何实现这一点的任何帮助

【问题讨论】:

  • 你的意思是序列化吗?
  • 变量数据 = $(form).serializeArray();
  • 你能以他们期望的格式展示它吗? JSON.stringify 或 $.param() ?
  • var data = JSON.stringify($(form).serializeArray())

标签: jquery ajaxform


【解决方案1】:

我推荐的一个有用的 API 是 FormData API

// Your object
const cfg = {
  "bridgeConfigurations": [{
      "configName": "Provider_Account_Id",
      "configValue": "xxxxx"
    },
    {
      "configName": "Provider_Auth_Token",
      "configValue": "xxxxx"
    }
  ]
};

$("#cfgForm").on("submit", function(ev) {
  ev.preventDefault(); // Prevent browser follow form-Action

  // Init FormData for form and its current fields values
  const FD = new FormData(this); // `this` is the cfgForm

  // Add bridgeConfigurations stuff to formData
  cfg.bridgeConfigurations.forEach(item => {
    FD.append("configName[]", item.configName);
    FD.append("configValue[]", item.configValue);
  });

  // Send the FormData
  $.ajax({
    url: "example.php",
    type: "POST",
    processData: false, // https://api.jquery.com/jquery.ajax/
    data: FD, // pass the formData 
  }).done(function(response) {
    console.log(response);
  });

});

【讨论】:

    【解决方案2】:

    你可以这样组合,我不确定你的确切期望是什么。我添加了 3 个示例:

    var $form = $('form');
    var data = {
      "bridgeConfigurations": [
        {
          "configName":"Provider_Account_Id",
          "configValue":"xxxxx"
        },
        {
          "configName":"Provider_Auth_Token",
          "configValue":"xxxxx"
        }
      ]
    };
    
    // EXAMPLE 1
    let formData = $($form).serializeArray();
    let mergeData = $.merge(formData, data["bridgeConfigurations"]);
    let finalData = JSON.stringify(mergeData);
    console.log("Example 1: ", finalData);
    
    // EXAMPLE 2
    let formData1 = $($form).serializeArray();
    let mergeData1 = $.merge(formData1, [data]);
    let finalData1 = JSON.stringify(mergeData1);
    console.log("Example 2: ", finalData1);
    
    // EXAMPLE 3
    let formData2 = $($form).serializeArray();
    let formDatas2 = {};
    formData2.forEach((value) => { formDatas2[value['name']] = value['value']; });
    let mergeData2 = $.extend({}, formDatas2, data);
    let finalData2 = JSON.stringify(mergeData2);
    console.log("Example 3: ", finalData2);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <form>
      <input type="text" name="name" value="demoName">
      <input type="email" name="email" value="dummy@mail.com">
    </form>

    希望对您有所帮助。

    【讨论】:

    • @ippezRobert,你能检查更新的答案吗,你想要这样吗?
    • 示例二几乎接近预期结果:您的解决方案给出了这个[ { name: "providerName", value: "efw" }, { name: "providerKey", value: "ewrtew" }, { name: "countryCode", value: "3243" }, { name: "phoneNo", value: "324" }, { name: "providerDescription", value: "sfesa" }, { bridgeConfigurations: [ { configName: "Provider_Account_Id", configValue: "sdfs" }, { configName: "Provider_Auth_Token", configValue: "sdfs" }, ], }, ]
    • 预期结果是{ "phoneNo": "324", "providerName": "efw", "providerDescription": "sfesa", "providerKey": "ewrtew", "countryCode": "3243", "bridgeConfigurations": [ { "configName": "Provider_Account_Id", "configValue": "sdfs" }, { "configName": "Provider_Auth_Token", "configValue": "sdfs" } ] }
    • 当我尝试通过邮递员发布时,上述解决方案 2 的结果会引发错误 "java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 2 column 6 path $[0] "
    • 我添加了第三个示例,根据您的评论,您可以查看。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2012-01-19
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多