jQuery POST请求 - 返回JSON

6

我想使用jQuery的$.ajax方法进行POST请求,发送一些信息(通过POST方式发送,如:page.aspx?var1=value...)。

但是我还希望jQuery能够处理返回JSON格式的服务,以便我可以获取到一个JSON对象。

var data = {name: _name, ...};

var request = $.ajax({
    url: url,
    type: "post",
    data: data,
    //dataType: "json"
});

只要我使用dataType: "json",就可以接收JSON对象,但是在请求时出现了解析错误!希望你能帮我解决这个问题!非常感谢您提前的帮助!

你得到的确切错误是什么? - Tom Walters
1
如果你得到了解析错误,很可能是因为你的 JSON 是无效的。你能将返回的 JSON 字符串粘贴在这里吗?很可能语法出了问题。 - SikoSoft
您可以在请求中设置一个类似于“Content-Type: application/json”的头部,jQuery会自动知道它正在获取什么。 - Merec
除非服务器定义了一种方法,否则您无法控制服务器将发送给您的内容。那么,您应该以JSON格式发送表单,还是应该发送标准的POST对象?下一个问题是 - 服务器定义的响应格式是什么? - Trent
天啊,你们真的是太快了!!我想我已经找到了问题所在。我一直以为 parseError 是因为它试图将我的 POST 数据解析成 JSON,但实际上是服务器返回了一个格式不正确的 JSON!!! :)我对吗?dataType: 'json' 是设置接收 JSON 对象的方式,而 type: 'post' 则允许我使用任何数据进行正常的 POST 调用,对吧?非常感谢你们的快速响应和帮助!! - Nik
4个回答

9

你需要将请求的URL中的数据转换为JSON格式,例如:

echo json_encode($response);

然后您将在成功函数中获得此类响应JSON:

       $.ajax({
            type:"POST",
            url: "your_url",
            data:data,
            success: function (response){
                var arr = $.parseJSON(response);

            }
        });

2
根据我的经验,使用浏览器本身的JSON解析器而不是jQuery库进行解析时,我获得了最佳结果。现代浏览器现在都支持这种方法,使其成为更好的跨浏览器兼容性方法。 var arr = JSON.parse(response); - Epiphany

0
根据jQuery $.post文档,我强烈建议最初实现所有主要的回调方法(donefailalways),以便如果您的JSON响应存在错误,则不会被隐藏:
var jqxhr = $.post( 
    "example.php", 
    function(response) {var arr = JSON.parse(response);},
    'json'
)
.done(function() {console.log( "second success" );})
.fail(function() {console.log( "error" );})
.always(function() {console.log( "finished" );});

0

请确保您的服务器端脚本返回编码后的 JSON。

在 PHP 中使用 json_encode()

echo json_encode($response);

同时在$.ajax调用中设置dataType : 'json'


正确的方法是通过 header('Content-type: application/json'); 在您的POST文件中设置标题,这将强制服务器将其识别为json。此时不需要 dataType:json - PlantTheIdea
1
@LifeInTheGrey 当你设置 dataType 时,这不就是 jQuery 所做的吗? - bart s
@barts,它确实尝试着这样做,但只有一部分时间是成功的。一个正确的PHP头声明可以保证100%的成功率。而且出于性能原因,使用服务器端的PHP代码而不是JavaScript代码更有意义,不是吗? - PlantTheIdea
@LifeInTheGrey dataType: 'json' 表示响应类型为 JSON,如果您的 PHP 脚本正确设置了 Content-Type: application/json 响应头,则不需要它。否则就需要它。 - Dipesh Parmar
@DipeshParmar,重点是通过在PHP中声明标题,您可以避免不必要的Javascript。这意味着后端有保证的结果,并且前端处理更快。但这只是最佳实践建议,您可以按照自己的意愿进行操作。 - PlantTheIdea

0

首先,POST请求不会在URL后附加参数。您指定的格式适用于GET请求。 您可以通过以下方式实现相同的目标:

$.post(
'/yourURLL',
{'data' : dataJson},
function(data){
    handleIncomingJSON(data);
}).error(function(data, textStatus){handleUnsuccessfulSave(data, textStatus)});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接