使用jQuery Ajax POST序列化JSON数据包

9
我有一个类似于socket的数据结构。
var s = {
    "a": "foo",
    "b": 5,
    "c": {"d": "a long string"},
    "e": {
        "f": {
            "g": {
                "h": [1, 0, -2.1, 1.43]
            }
        },
        "i": {
            "j": {
                "k": [-3.2, 3.003, 0, 0]
            }
        }
    }
};

我想将变量s的"a"、"b"、"c"和"e"键存储到数据库表中,以便之后可以重新构建它们。我通过jQuery Ajax POST发送了变量s。这些值将被插入并存储为纯文本(除了"b",它始终是一个数字)。
ajax: {
    url: uri,
    type: "POST",
    data: s,
    dataType: "json",
    success: function(data, status) { .. }
}

这是我遇到的问题。在Firebug中,我可以看到我的帖子参数...它们真的很混乱。似乎数据已经在每个元素的级别上序列化(有点像深度序列化),而我希望得到类似于...的东西。
e={"f":{"g":{"h":[1,0,-2.1,1.43]}},"i":{"j":{"k":[-3.2,3.003,0,0]}}}

更新:相反,我收到以下内容(我已经取消转义下面的字符串以使其更易读)
a=foo&b=5&c[d]=a long string&e[f][g][h][]=1&e[f][g][h][]=0&e[f][g][h][]=-2.1&e[f][g][h][]=1.43

也许我做这件事的方式不对,请随意指导我更好的方法。
1个回答

11

使用JSON.stringify方法将数据对象序列化为字符串并进行提交。在服务器端,只需将其原样存储在数据库中即可。尝试以下操作:

ajax: {
    url: uri,
    type: "POST",
    data: { data: JSON.stringify(s) },
    dataType: "json",
    success: function(data, status) { .. }
}

现代浏览器几乎都原生支持JSON。如果某些浏览器不支持,可以从http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js引入所需的js文件。


我相当确定你将对该数据对象进行双重编码,因为你正在对 s 调用 stringify。 - Joe
如果数据值是字符串,jQuery只会进行URI编码以使其足够安全地通过HTTP传输。我认为它不会对字符串进行编码。 - ShankarSangoli
我已经增加了一点更多的解释……请在原始帖子中查看更新。JSON.stringify并不能真正得到我想要的结果。再次强调,可能有更好的方法来实现我的目标……所以请随意建议。 - punkish
@punkish - 使用JSON.stringify,它将提供一个序列化字符串,易于发布。如果您将对象直接传递给jQuery,则它将为其中的每个属性在第一级内创建键/值对,这就是您在firebug中看到的内容。 - ShankarSangoli
谢谢大家...以下是解决方法 var str = ""; for (var i in s) {str += i + "=" + (typeof(s[i]) == "object" ? JSON.stringify(s[i]) : S[i]) + "&";} - punkish
@ShankarSangoli - +1 保存了我很多麻烦 =) - Cyclonecode

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