JSON格式的POST数据


86

我有一些数据需要转换为JSON格式,然后使用JavaScript函数发布。

<body onload="javascript:document.myform.submit()">
<form action="https://www.test.net/Services/RegistrationService.svc/InviteNewContact" method="post" name="myform">
  <input name="firstName" value="harry" />
  <input name="lastName" value="tester" />
  <input name="toEmail" value="testtest@test.com" />
</form>
</body>

这就是帖子现在的样子。我需要它以JSON格式提交值,并使用JavaScript进行POST。


JSON数据应具有什么结构?只是{"firstName":"harry", "lastName":"tester", "toEmail":"testtest@test.com"}
Gumbo

1
是的,数据将采用您描述的格式!感谢您的答复!

Answers:


171

不确定是否要使用jQuery。

var form;

form.onsubmit = function (e) {
  // stop the regular form submission
  e.preventDefault();

  // collect the form data while iterating over the inputs
  var data = {};
  for (var i = 0, ii = form.length; i < ii; ++i) {
    var input = form[i];
    if (input.name) {
      data[input.name] = input.value;
    }
  }

  // construct an HTTP request
  var xhr = new XMLHttpRequest();
  xhr.open(form.method, form.action, true);
  xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

  // send the collected data as JSON
  xhr.send(JSON.stringify(data));

  xhr.onloadend = function () {
    // done
  };
};

62
我认为这是一个很好,简洁,简洁的示例,说明了如何在没有100K框架的情况下以20行代码完成工作。
spidee 2012年

1
@IanKuca谢谢:)我想知道我们是否可以在不对数据进行urlencode的情况下发送json数据?我的意思是我要发送数据,如"cmd":"<img src=0 onerror=alert(1)>"%3Cimg+src%3D0+onerror%3Dalert%281%29%3E
tli2020

2
@liweijian您应该随身携带任何JSON.stringify回报。
JK

2
@IanKuca似乎帖子数据是由html formnot编码的JSON.stringify
tli2020

@liweijian,如果是这种情况,则需要先对表单值进行url解码
Kevin

28

这是使用jQuery的示例...

 <head>
   <title>Test</title>
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
   <script type="text/javascript" src="http://www.json.org/json2.js"></script>
   <script type="text/javascript">
     $(function() {
       var frm = $(document.myform);
       var dat = JSON.stringify(frm.serializeArray());

       alert("I am about to POST this:\n\n" + dat);

       $.post(
         frm.attr("action"),
         dat,
         function(data) {
           alert("Response: " + data);
         }
       );
     });
   </script>
</head>

jQuery serializeArray函数使用表单值创建一个Javascript对象。然后,您可以根据需要使用JSON.stringify将其转换为字符串。您也可以减轻身体负担。


2
乔什(Josh),关于jQuery的示例显示了其他方面:与JSON相比,看起来更像是标准查询字符串。
桑普森

4
你们是对的。我已经相应地更新了答案。谢谢!
乔什·斯托多拉

7
这是一个很好的例子,但是根据标题,应该使用javascript而不是javascript库(在这种情况下为jQuery)执行
Juan Carlos Alpizar Chinchilla

4
当然,欢迎您用辛苦的方式来做。其他人都使用jQuery。
PaulMurrayCbr 2014年

9
该问题询问如何使用javascript而不是jquery库发布数据。这回答了错误的问题。
布莱尔·安德森


1

使用新的FormData对象(和其他ES6东西),您可以执行以下操作将整个表单转换为JSON:

let data = {};
let formdata = new FormData(theform);
for (let tuple of formdata.entries()) data[tuple[0]] = tuple[1];

然后xhr.send(JSON.stringify(data));就像Jan的原始答案一样。


那行不通。FormData对象不能有效地字符串化为JSON。
昆汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.