无效的Json用法?

时间:2012-07-30 10:01:07

标签: javascript jquery json

有时我 see 人们将json发送到服务器:

$.ajax({
url: ...
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { 'page': '100AAAAAf00' },
responseType: "json",
success: ...,
error: ...
});

但是{ 'page': '100AAAAAf00' } 不是 Json。

并且说contentType是json ...

Json是文本表示。

e.g。 :"{ 'page': '100AAAAAf00' }"

我在这里遗漏了什么吗? (jQuery是否在幕后进行一些翻译?)

维基:

  

JSON或JavaScript Object Notation,是基于文本的(!!)   为人类可读数据交换而设计的开放标准。

3 个答案:

答案 0 :(得分:3)

$.ajax("/", {

    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: {
        'page': '100AAAAAf00'
    },
    type: 'POST',
    responseType: "json"

});

错误。这将向请求正文发送正常的application/x-www-form-urlencoded请求:

page=100AAAAAf00

但由于标题为"application/json; charset=utf-8",因此实际上谎言<​​/ strong>到服务器。

要使用jQuery将真实,纯粹,实际的JSON发送到服务器,您可以使用:

$.ajax("/", {

    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: JSON.stringify({ //If data is string, jQuery will not try to process it
        'page': '100AAAAAf00'
    }),
    type: 'POST',
    responseType: "json"

});

现在请求正文将是:

{"page":"100AAAAAf00"}

这根本不能与php的$_POST一起使用,因为它在application/x-www-form-urlencoded的基础上工作, 所以也许这就是人们更喜欢前者的原因..

可以在开发者工具中使用Chrome的网络标签来验证我的声明:

http://jsfiddle.net/sV5m4/1/ - 带有json标头的实际json

enter image description here

在这里:

http://jsfiddle.net/sV5m4/2/ - x-www-form-urlencoded,标头声称是json

enter image description here

答案 1 :(得分:1)

有一个简单的函数可以将对象转换为JSON字符串...

JSON.stringify({ 'page': '100AAAAAf00' }) // => '{ "page": "100AAAAAf00" }'

反过来......

JSON.parse('{ "page": "100AAAAAf00" }') // => { page: '100AAAAAf00' }

答案 2 :(得分:1)

在您的示例中,一切正确,data属性是对象。

由于jQuery.ajax(); docs data属性可能是对象,数组或字符串。

如果它是一个数组或一个对象,jQuery序列化它。