2010-02-17 34 views
74

Rõ ràng jQuery có khả năng giải mã một đối tượng hoặc chuỗi đã cho thành đối tượng JSON. Tuy nhiên, tôi có một đối tượng JS mà tôi cần POST trở lại máy chủ và tôi thấy không có tiện ích nào trong jQuery kết thúc tốt đẹp hàm JSON.stringify(). Chức năng này được tìm thấy trong Chrome, Safari 4, FF3.6 và IE8 nhưng không được tìm thấy trong các trình duyệt trước đó. Tôi có thể sử dụng nó một cách tự nhiên trong các trình duyệt có hỗ trợ nó, nhưng ngược lại buộc phải quay lại sử dụng các kịch bản JSON của Crockford.JSON xâu chuỗi thiếu từ jQuery 1.4.1?

Có tích hợp sẵn với jQuery xử lý mã hóa và giải mã JSON để thay thế các tập lệnh Crockford không?

+3

bài tương tự: http: // stackoverflow.com/questions/191881/serializing-to-json-in-jquery – sberry

+0

Có lẽ tôi thực sự câm, nhưng đây cũng là một bất ngờ hoàn toàn đối với tôi. Có vẻ như kịch bản của JSON.org là con đường để đi. – KevinM

Trả lời

30

Bạn có thể muốn kiểm tra này: http://www.json.org/js.html

+10

Vâng, điều đáng buồn là jQuery chưa thêm phương thức để làm điều này trực tiếp vào thư viện. Tôi đã kết thúc việc khai thác json.js với trình biên dịch Closure và đặt nó ở cuối tệp js của tôi nơi tôi đang làm việc. Nó sẽ thực hiện thủ thuật, nhưng có vẻ không cần thiết. – Geuis

+0

Tôi đã sử dụng http://code.google.com/p/jquery-json/ giải pháp. Làm việc tốt cho tôi. – crsuarezf

14

jQuery có thể giải mã chuỗi JSON natively với jQuery.parseJSON().

Đối với mã hóa mặc dù, tôi chỉ biết một plugin: jquery-json

+2

có vấn đề gì khi sử dụng JSON.stringify trực tiếp? – zcrar70

+1

@ zcrar70, ông đặc biệt yêu cầu một trình bao bọc 'JSON.stringify' .. trừ khi nhận xét của bạn dành cho OP. –

+0

và vì vậy ông đã làm, lời xin lỗi của tôi. – zcrar70

26

Bạn có thể sử dụng "Thư viện Đóng cửa" (Google) để thực hiện một trình duyệt chéo JSON encoder/decoder.

Chỉ cần vào http://closure-compiler.appspot.com/

và chèn đoạn mã sau vào trường văn bản, sau đó nhấn "biên dịch":

// ==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; 
+0

Tôi nghĩ rằng 'serialize' nên được thay đổi thành' stringify' để tái sử dụng chức năng gốc của trình duyệt nếu có sẵn – Tomas

+1

đổi tên JSON.serialize thành JSON.stringify – stewe

+0

như phương pháp này! –

3

jQuery không cần chức năng này trong nội bộ và do đó không cung cấp một phương pháp thuận tiện để làm như vậy.

JSON.stringify() là cách tiêu chuẩn và được khuyến nghị để mã hóa một đối tượng thành một biểu diễn chuỗi JSON của đối tượng đó. Nó là một phương thức của đối tượng JSON nguyên gốc trong nhiều trình duyệt và bạn nên sử dụng json2.js (https://github.com/douglascrockford/JSON-js) để cung cấp dự phòng.

1

Thường thì hàm JSON.stringify() không bắt buộc khi sử dụng jQuery. Lấy ví dụ trường hợp phổ biến của việc sử dụng ajax để gửi dữ liệu javascript để máy chủ, jquery đã tích hợp chức năng để xử lý thế này: (ví dụ từ 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); 
}); 

Trong tất cả các ví dụ trên các dữ liệu javascript gửi là serialized bởi jQuery tự động.

Việc tuần tự hóa trong các trường hợp này không giống như JSON.Stringify(), thay vào đó dữ liệu được tuần tự hóa thành chuỗi truy vấn html (xem: http://en.wikipedia.org/wiki/Query_string#Structure).

Tuy nhiên hình thức này của serialization là tốt cho hầu hết (nhưng không phải tất cả) các ứng dụng

2

Để xây dựng dựa trên câu trả lời stewe của, trình biên dịch đóng cửa với nâng cao bật mang đến cho bạn một kịch bản mà làm ô nhiễm không gian tên toàn cầu với một loạt các một biến thư. Vì vậy, tôi chỉ quấn nó trong một cuộc gọi chức năng ẩn danh như vậy:

(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); })();

Bây giờ bạn có thể gọi:

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