jQuery 1.4.1 中缺少 JSON 字符串化?
Posted
技术标签:
【中文标题】jQuery 1.4.1 中缺少 JSON 字符串化?【英文标题】:JSON stringify missing from jQuery 1.4.1? 【发布时间】:2011-01-17 15:46:13 【问题描述】:显然 jQuery 能够将给定的对象或字符串解码为 JSON 对象。但是,我有一个 JS 对象,我需要将其 POST 回服务器,并且在 jQuery 中找不到包含 JSON.stringify() 函数的实用程序。在 Chrome、Safari 4、FF3.6 和 IE8 中可以找到该功能,但在早期浏览器中没有。我可以在支持它的浏览器中本地使用它,但否则我不得不回退到使用 Crockford 的 JSON 脚本。
是否有一些内置的 jQuery 可以处理 JSON 编码和解码来代替 Crockford 脚本?
【问题讨论】:
类似帖子:***.com/questions/191881/… 也许我真的很笨,但这对我来说也是一个完全的惊喜。看起来 JSON.org 的脚本是要走的路。 【参考方案1】:您可能想检查一下: http://www.json.org/js.html
【讨论】:
是的,很遗憾 jQuery 没有直接向库中添加方法来执行此操作。我最终使用 Closure 编译器缩小了 json.js,并将其粘贴在我正在工作的 js 文件的底部。它会起作用,但似乎没有必要。 我一直在使用code.google.com/p/jquery-json 解决方案。对我来说很好。 链接不再起作用。这个答案并没有真正给出答案,因为它只是一个链接。【参考方案2】:您可以使用“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;
【讨论】:
我认为serialize
应该改为 stringify
以重用浏览器的原生功能(如果可用)
将 JSON.serialize 重命名为 JSON.stringify【参考方案3】:
jQuery 可以使用 jQuery.parseJSON()
原生解码 JSON 字符串。
对于编码,我只知道一个插件:jquery-json
【讨论】:
@zcrar70,他特别要求JSON.stringify
包装器.. 除非您的评论是针对 OP 的。【参考方案4】:
jQuery 内部不需要这个功能,因此没有提供方便的方法来做到这一点。
JSON.stringify() 是将对象编码为该对象的 JSON 字符串表示的标准和推荐方法。它是许多浏览器中原生 JSON 对象的一种方法,建议您使用 json2.js (https://github.com/douglascrockford/JSON-js) 提供备用。
【讨论】:
【参考方案5】:为了建立在 Stee 的回答之上,打开了 Advanced 的闭包编译器会为您提供一个脚本,该脚本会用一堆单字母变量污染全局命名空间。所以,我只是将它包装在一个匿名函数调用中,如下所示:
(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');
【讨论】:
【参考方案6】:在使用 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)。
但是这种形式的序列化对于大多数(但不是所有)应用程序来说都很好
【讨论】:
以上是关于jQuery 1.4.1 中缺少 JSON 字符串化?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 5.7 JSON_EXTRACT 不适用于对象中的带引号的字符串:[错误]“字符串中缺少右引号”
为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?