2010-02-17 6 views
74

Anscheinend hat jQuery die Fähigkeit, ein bestimmtes Objekt oder eine Zeichenfolge in ein JSON-Objekt zu decodieren. Ich habe jedoch ein JS-Objekt, das ich an den Server zurücksenden muss, und ich finde kein Dienstprogramm in jQuery, das die JSON.stringify() -Funktion umschließt. Diese Funktion ist in Chrome, Safari 4, FF3.6 und IE8 zu finden, wurde aber in früheren Browsern nicht gefunden. Ich kann es nativ in den Browsern verwenden, die es unterstützen, aber andererseits bin ich gezwungen, auf die Verwendung von Crockfords JSON-Skripten zurückzugreifen.JSON stringify fehlt von jQuery 1.4.1?

Gibt es einige integrierte mit jQuery, die JSON Codierung und Decodierung behandelt, die die Stelle der Crockford-Skripts übernimmt?

+3

ähnlicher Beitrag: http: // Stackoverflow.com/questions/191881/serialisieren-zu-json-in-jquery – sberry

+0

Vielleicht bin ich wirklich dumm, aber das war eine komplette Überraschung für mich auch. Sieht so aus, als wäre JSON.orgs Skript der richtige Weg. – KevinM

Antwort

30

Sie wollen könnte dies überprüfen: http://www.json.org/js.html

+10

Ja, es ist irgendwie traurig, dass jQuery keine Methode hinzugefügt hat, um dies direkt in der Bibliothek zu tun. Ich endete damit, json.js mit dem Closure-Compiler zu verkleinern und steckte ihn in den unteren Bereich meiner js-Datei, in der ich arbeite. Es wird den Trick machen, scheint aber unnötig. – Geuis

+0

Ich habe http://code.google.com/p/jquery-json/ solution verwendet. Funktioniert gut für mich. – crsuarezf

14

jQuery JSON-Strings nativ mit jQuery.parseJSON() dekodieren kann.

Für Codierung aber ich weiß nur eines Plugins: jquery-json

+2

Was ist falsch daran, JSON.Stringify direkt zu verwenden? – zcrar70

+1

@ zcrar70, fragt er speziell nach einem JSON.stringify-Wrapper .. es sei denn, Ihr Kommentar ist für das OP bestimmt. –

+0

und so tat er, meine Entschuldigung. – zcrar70

26

Sie können "Closure Library" (Google) verwenden, um einen Cross-Browser-JSON-Encoder/Decoder zu machen. Folgendes in das Textfeld

Gehen Sie einfach auf http://closure-compiler.appspot.com/

und einfügen, dann drücken Sie „Übersetzen“:

// ==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

Ich denke, 'serialize' sollte in' stringify' geändert werden, um die native Funktion des Browsers wiederzuverwenden, falls verfügbar – Tomas

+1

umbenannt JSON.serialize zu JSON.stringify – stewe

+0

wie dieser Ansatz! –

3

jQuery diese Funktionalität nicht benötigen intern und somit keine bequeme Methode, um nicht bieten tun Sie dies.

JSON.stringify() ist die standardmäßige und empfohlene Methode zum Codieren eines Objekts in eine JSON-Zeichenfolgendarstellung dieses Objekts. Es ist eine Methode des nativen JSON-Objekts in vielen Browsern, und es wird empfohlen, dass Sie json2.js (https://github.com/douglascrockford/JSON-js) verwenden, um einen Fallback bereitzustellen.

1

Oft ist die JSON.stringify() - Funktion nicht erforderlich, wenn Sie jQuery verwenden. Nehmen Sie zum Beispiel das gemeinsame Fall von Ajax mit JavaScript-Daten an den Server zu senden, hat jquery integrierten Funktionen zu handhaben: (Beispiele aus 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); 
}); 

In allen Beispielen über die JavaScript-Daten gesendet wird serialisiert von jQuery automatisch.

Die Serialisierung in diesen Fällen ist nicht identisch mit JSON.Stringify(), stattdessen werden die Daten in eine HTML-Abfragezeichenfolge serialisiert (siehe: http://en.wikipedia.org/wiki/Query_string#Structure).

jedoch diese Form der Serialisierung ist in Ordnung für die meisten (aber nicht alle) Anwendungen

2

auf stewe Antwort zu erstellen, mit Schließung Compiler Erweitern eingeschaltet gibt Ihnen einen Skript, das den globalen Namensraum mit einem Bündel verpestet von Ein-Buchstaben-Variablen. Also, ich wickeln Sie es nur in einem anonymen Funktion Aufruf wie folgt:

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

Jetzt können Sie anrufen:

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