jQuery在请求正文中发布有效的json


180

因此,根据jQuery Ajax文档,它在发送请求时以查询字符串的形式序列化数据,但是设置processData:false应允许我在正文中发送实际的JSON。不幸的是,我很难先确定是否发生这种情况,然后才确定要发送给服务器的对象的外观。我所知道的是服务器未解析我正在发送的内容。

使用http客户端发布对象文字时{someKey:'someData'},它可以工作。但是,当使用带有的jQuery时data: {someKey:'someData'},它将失败。不幸的是,当我在Safari中分析请求时,它说消息的有效负载是[object Object]……很好……而在Firefox中,该帖子是空白的……

当在Java端记录主体内容时,它实际上得到了,[object Object]因此如何发送REAL JSON数据?

有没有人有过使用Java服务序列化JSON数据以及从jQuery发送请求的经验?

顺便说一句,这是完整的$ .ajax请求:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});

Answers:


292

实际的JSON请求如下所示:

data: '{"command":"on"}',

发送实际JSON字符串的位置。对于更通用的解决方案,可使用JSON.stringify()将对象序列化为JSON,如下所示:

data: JSON.stringify({ "command": "on" }),

为了支持没有该JSON对象的旧版浏览器,请使用json2.js来添加该对象。


目前正在发生的事情是因为您拥有processData: false,基本上是在发送此消息:({"command":"on"}).toString()[object Object]您在请求中看到的内容。


所以我不再需要processData:false使用JSON.stringify()吗?
布拉德(Brad)2010年

6
@brad-正确,执行此操作后无所谓,因为它已经是一个字符串,在这种情况下,jQuery不会对其进行进一步处理
尼克·克雷弗

2
像魅力一样工作,非常感谢!那么所有的请求主体都应该是在另一端被解析的字符串是否正确?
布拉德(Brad)2010年

为什么jQuery解析data成字符串而不是将其作为JSON发送?
亚当·

附注:如果有人需要它作为一个“身体请求负载”,而不是形式的数据,不要忘了,包括contentType: "application/json; charset=utf-8",在这个线程中提到: stackoverflow.com/questions/21201270/...
raydlevel5
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.