JQuery 1.4.1中缺少 JSON 字符串?

显然,jQuery 具有将给定对象或字符串解码为 JSON 对象的能力。但是,我有一个 JS 对象,需要将其 POST 回服务器,而且在 jQuery 中没有发现包装 JSON.stringify ()函数的实用程序。这个功能可以在 Chrome、 Safari 4、 FF3.6和 IE8中找到,但是在早期的浏览器中找不到。我可以在支持它的浏览器中使用它,但是在其他情况下,我不得不退回到使用 Crocford 的 JSON 脚本。

是否有一些内置的 jQuery 处理 JSON 编码和解码,取代了 Crocford 脚本?

64868 次浏览

JQuery 可以使用 jQuery.parseJSON()对 JSON 字符串进行本机解码。

但是对于编码,我只知道一个插件: Jquery-Json

你可以使用“ Closure Library”(Google)制作一个跨浏览器的 JSON 编码器/解码器。

调到 http://closure-compiler.appspot.com/

然后在文本栏中插入以下内容,点击“编译”:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @use_closure_library true
// ==/ClosureCompiler==


goog.require('goog.json');
if (!window['JSON']) window['JSON']={};
if (typeof window['JSON']['stringify'] !== 'function') window['JSON']['stringify']=goog.json.serialize;
if (typeof window['JSON']['parse'] !== 'function') window['JSON']['parse']=goog.json.parse;

JQuery 在内部不需要这个功能,因此不提供这样做的便利方法。

Stringify ()是将对象编码为该对象的 JSON 字符串表示形式的标准和推荐方法。它是许多浏览器中原生 JSON 对象的一种方法,建议您使用 json2.js ( https://github.com/douglascrockford/JSON-js )来提供备份。

在使用 jQuery 时,通常不需要 JSON.stringify ()函数。以使用 ajax 向服务器发送 javascript 数据为例,jquery 有内置的函数来处理这个问题: (来自 http://api.jquery.com/category/ajax/的例子)

$.post("test.php", { name: "John", time: "2pm" } );
$.post("test.php", { 'choices[]': ["Jon", "Susan"] });
$.getJSON("test.js", { name: "John", time: "2pm" }, function(json) {
alert("JSON Data: " + json.users[3].name);
});

在上面的所有示例中,发送的 javascript 数据都是由 jQuery 自动序列化的。

这些情况下的序列化不同于 JSON.Stringify () ,而是将数据序列化为一个 html 查询字符串(参见: Http://en.wikipedia.org/wiki/query_string#structure.

然而,这种形式的序列化对于大多数(但不是所有)应用程序来说是可以的

为了构建 stewe 的答案,启用了 高级的闭包编译器提供了一个脚本,该脚本使用一堆单字母变量污染全局名称空间。所以,我把它封装在一个匿名函数调用中,就像这样:

(function() {
function g(a) {
var b = typeof a;
if ("object" == b)
if (a) {
if (a instanceof Array) return "array";
if (a instanceof Object) return b;
var c = Object.prototype.toString.call(a);
if ("[object Window]" == c) return "object";
if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) return "array";
if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) return "function"
} else return "null";
else if ("function" == b && "undefined" == typeof a.call) return "object";
return b
};


function h(a) {
a = "" + a;
if (/^\s*$/.test(a) ? 0 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x10-\x1f\x80-\x9f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, ""))) try {
return eval("(" + a + ")")
} catch (b) {}
throw Error("Invalid JSON string: " + a);
}


function i(a, b) {
var c = [];
j(new k(b), a, c);
return c.join("")
}


function k(a) {
this.a = a
}


function j(a, b, c) {
switch (typeof b) {
case "string":
l(b, c);
break;
case "number":
c.push(isFinite(b) && !isNaN(b) ? b : "null");
break;
case "boolean":
c.push(b);
break;
case "undefined":
c.push("null");
break;
case "object":
if (null == b) {
c.push("null");
break
}
if ("array" == g(b)) {
var f = b.length;
c.push("[");
for (var d = "", e = 0; e < f; e++) c.push(d), d = b[e], j(a, a.a ? a.a.call(b, "" + e, d) : d, c), d = ",";
c.push("]");
break
}
c.push("{");
f = "";
for (e in b) Object.prototype.hasOwnProperty.call(b, e) && (d = b[e], "function" != typeof d && (c.push(f), l(e, c), c.push(":"),
j(a, a.a ? a.a.call(b, e, d) : d, c), f = ","));
c.push("}");
break;
case "function":
break;
default:
throw Error("Unknown type: " + typeof b);
}
}
var m = {
'"': '\\"',
"\\": "\\\\",
"/": "\\/",
"\u0008": "\\b",
"\u000c": "\\f",
"\n": "\\n",
"\r": "\\r",
"\t": "\\t",
"\x0B": "\\u000b"
},
n = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g;


function l(a, b) {
b.push('"', a.replace(n, function(a) {
if (a in m) return m[a];
var b = a.charCodeAt(0),
d = "\\u";
16 > b ? d += "000" : 256 > b ? d += "00" : 4096 > b && (d += "0");
return m[a] = d + b.toString(16)
}), '"')
};
window.JSON || (window.JSON = {});
"function" !== typeof window.JSON.stringify && (window.JSON.stringify = i);
"function" !== typeof window.JSON.parse && (window.JSON.parse = h);
})();

现在你可以打电话:

var JSONString = JSON.stringify({name: 'value'});