Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在不知道表单的长度的情况下发布表单中的数据_Jquery_Json_Ajax_Forms - Fatal编程技术网

Jquery 在不知道表单的长度的情况下发布表单中的数据

Jquery 在不知道表单的长度的情况下发布表单中的数据,jquery,json,ajax,forms,Jquery,Json,Ajax,Forms,我需要使用jQuery发布一些表单数据,字段输入值需要以JSON格式发布。问题是表单字段由肯定会出现的字段组成,比如:名字、姓氏和电子邮件,但是后面的字段可以是任意数字,因为表单是根据GET请求构建的。所以通常我会这样做: var firstName = $('input[name="firstName"]').val(); var lastName = $('input[name="lastName"]').val(); var email = $('input[name="email"]')

我需要使用jQuery发布一些表单数据,字段输入值需要以JSON格式发布。问题是表单字段由肯定会出现的字段组成,比如:名字、姓氏和电子邮件,但是后面的字段可以是任意数字,因为表单是根据GET请求构建的。所以通常我会这样做:

var firstName = $('input[name="firstName"]').val();
var lastName = $('input[name="lastName"]').val();
var email = $('input[name="email"]').val();

data: JSON.stringify({
  "firstName": firstName,
  "lastName": lastName,
  "email": email
})
然而,这对我剩下的字段不起作用。理想情况下,我需要像一个each函数或一些东西一样循环其他问题,并将这个循环放到JSON.stringify中,但我不知道如何做到这一点。但你可能会说,为什么不使用:

$('form').serialize();
只获取所有表单数据,但问题是JSON需要采用以下格式

{
  "firstName": "string",
  "lastName": "string",
  "email": "string",
  "responses": [
    {
      "questionKey": 0, //this needs to be the ID of the input
      "responseText": "string", //this needs to the value of the input
    } //with this part of the JSON repeating for each question
  ]
}
所有这些附加字段都具有相同的输入类,因此我可以在jQuery中轻松地使用它们。我真的被困住了,我非常感谢你的帮助。谢谢:)

更新-以下是表单字段的示例:

<input name="firstName" id="firstName" type="text" class="known-questions">
<input name="lastName" id="lastName" type="text" class="known-questions">
<input name="email" id="email" type="email" class="known-questions">
<input name="45435345345" id="45435345345" type="text" class="unknown-questions">
<input name="43443539864" id="43443539864" type="text" class="unknown-questions">
<input name="43344243529" id="43344243529" type="text" class="unknown-questions"> //there could be any number of these 'unknown-questions' class inputs

//这些“未知问题”可以是任意数量的课堂输入

您已经说过,对于
响应
数组,每个带有响应的输入元素将共享一个类。尝试每个
循环,假设
未知问题
为该类名:

var responsesArray = [];

$(".unknown-questions")
    .each(function(idx, obj)
    {
        responsesArray.push(
            {
                "questionKey" : obj.id,
                "responseText" : $(obj).val()
            });
    });
您还说过要使用jQuery发送表单数据。不清楚您是想获取还是发布,或者是否将使用jQuery AJAX函数,但我使用
jQuery.GET
调用测试了上述功能,如下所示:

$.get("https://httpbin.org/get",
    {
        "firstName" : firstName,
        "lastName" : lastName,
        "email" : email,
        "responses" : responsesArray
    });
但我不确定这是你想要的。如果您想要一个JSON字符串来捕获可以作为单个参数发送的对象,那么:

var jsonString =
    JSON.stringify(
    {
        "firstName" : firstName,
        "lastName" : lastName,
        "email" : email,
        "responses" : responsesArray
    });
生成以下JSON结构(我插入了换行符并编写了示例表单字段和值):


已序列化为所需结构的完整表单:

var data ={};
$('.known-questions').each(function(){
    data[this.name] = this.value;
});

data.responses = $('.unknown-questions').map(function(){
   return {questionKey: this.id, responseText:this.value};
}).get();

var postJson = JSON.stringify(data);

为什么不使用对象数组?了解生成的html结构会有很大帮助。这样就不难遍历元素并基于名称或其他相关属性添加属性/值。对于已知字段,可以简化为这些名称的数组,并循环该数组以设置属性/值,而无需全部写出manually@SimonSchüpbach不是一组对象的预期结果吗?OP正在试图找出如何创建这些对象。SBTW
。serialize()
不会生成JSON@Musa你是对的,我应该对此进行扩展,告诉你我将如何将其转换为JSONSimilar for
已知问题
将简化手动将其添加到主对象的过程感谢pb2q,通过将数据推送到数组中,我看到了您在做什么。那么这是如何与我的名字、姓氏和电子邮件字段JSON进行交互的呢?JSON类似:{“firstName”:firstName,“lastName”:lastName,“Email”:Email}并确保它位于JSON的正确级别上?@user1190132我将添加一个
$。获取
示例简短感谢pb2q这也回答了我的问题。我很感激你派来帮助我的时间,我仍然在学习新的东西techniques@user1190132很乐意帮忙。charlietfl的答案当然更完整/简洁。现在,非常感谢您,这真的很有帮助,我也感谢您制作演示
var data ={};
$('.known-questions').each(function(){
    data[this.name] = this.value;
});

data.responses = $('.unknown-questions').map(function(){
   return {questionKey: this.id, responseText:this.value};
}).get();

var postJson = JSON.stringify(data);