jQuery:如何阻止AJAX函数转义用于POST数据的JSON字符串

tic*_*ian 12 javascript php ajax jquery json

我需要将表单中的所有输入序列化为JSON字符串.
这篇文章的帮助下,我可以成功创建一个有效的字符串,如下所示:

{"input01":"value01","input02":"value02","input03":"value03"}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用jQuery的Ajax函数将字符串用于POST数据时,似乎在字符串中添加了反斜杠,导致使用GET而不是POST发送JSON字符串.加载的PHP页面返回一个$_GET数组:

[{\"input01\":\"value01\",\"input02\":\"value02\",\"input03\":\"value03\"}] =>
Run Code Online (Sandbox Code Playgroud)

alert()在使用AJAX函数之前,我已经测试了JSON字符串,以确认结构是否正确.
此外,如果我只是手动输入有效的JSON字符串,AJAX会正确发布数据.

我的代码如下:

var dataJSON = $.toJSON($('#form').serializeObject());
alert(dataJSON);

$.ajax({
    type: "POST",
    url: "ajax.php",
    data: 'Query01=01&Query02=02',
    dataType: 'json',
    success: function(data){
       if (data==1){
         $('#wrap').load('ajax.php',dataJSON);
       }
    }
});
Run Code Online (Sandbox Code Playgroud)

cle*_*tus 11

这是默认行为$.ajax().您可以通过将processData选项设置为来更改它false.见$.ajax()选项.

data  Object, String
Run Code Online (Sandbox Code Playgroud)

要发送到服务器的数据.如果不是字符串,它将转换为查询字符串.它附加到GET请求的URL.请参阅processData选项以防止此自动处理.对象必须是键/值对.如果value是一个数组,则jQuery使用相同的键序列化多个值,即{foo:["bar1","bar2"]}变为'&foo = bar1&foo = bar2'.

processData   Boolean Default: true
Run Code Online (Sandbox Code Playgroud)

默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型"application/x-www-form-urlencoded" .如果要发送DOMDocuments或其他未处理的数据,请将此选项设置为false.


tic*_*ian 0

在搜索 Google 和 jQuery 网站后,我得出个人结论,该$.load函数将转换作为查询字符串传递给它的任何变量(正如我上面概述的原始问题)。如果您希望通过它传递 JSON 字符串,则必须手动输入该字符串。

为了解决这个问题,我使用了低级$.ajax函数。使用此方法的一个优点是我还可以使用标准.serialize()函数发送 POST 数据,而不必将表单数据转换为 JSON。

我的最终代码:

var formData = $('#form').serialize();

$.ajax({
     type: "POST",
     url: "ajax.php",
     data: 'Query01=01&Query02=02',
     dataType: 'json',
     success: function(data){
          if (data==1){
               $.ajax({
                    type: "POST",
                    url: "ajax.php",
                    data: formData,
                    success: function(html){
                         $("#wrap").replaceWith(html);
                    }   
               });
          }
     }
});
Run Code Online (Sandbox Code Playgroud)

如果其他人有解决方案,请评论。