web-dev-qa-db-fra.com

JSON stringify manquant dans jQuery 1.4.1?

Apparemment, jQuery a la capacité de décoder un objet ou une chaîne donné en un objet JSON. Cependant, j'ai un objet JS que je dois POST retourner au serveur et je ne trouve aucun utilitaire dans jQuery qui encapsule la fonction JSON.stringify (). Cette fonction se trouve dans Chrome, Safari 4, FF3.6 et IE8 mais ne se trouve pas dans les navigateurs précédents. Je peux l'utiliser nativement dans les navigateurs qui le prennent en charge, mais sinon je suis obligé de recourir à nouveau aux scripts JSON de Crockford.

Existe-t-il des fonctionnalités intégrées avec jQuery qui gèrent l'encodage et le décodage JSON qui remplacent les scripts Crockford?

74
Geuis

Vous voudrez peut-être vérifier ceci: http://www.json.org/js.html

30
shinkou

Vous pouvez utiliser "Closure Library" (Google) pour créer un encodeur/décodeur JSON multi-navigateur.

Allez simplement sur http://closure-compiler.appspot.com/

et insérez ce qui suit dans le champ de texte, puis appuyez sur "Compiler":

// ==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;
26
stewe

jQuery peut décoder les chaînes JSON de manière native avec jQuery.parseJSON() .

Pour l'encodage cependant, je ne connais qu'un plugin: jquery-json

14
Gabriele Petrioli

jQuery n'a pas besoin de cette fonctionnalité en interne et ne fournit donc pas de méthode pratique pour le faire.

JSON.stringify () est le moyen standard et recommandé de coder un objet en une représentation sous forme de chaîne JSON de cet objet. Il s'agit d'une méthode de l'objet JSON natif dans de nombreux navigateurs, et il est recommandé d'utiliser json2.js (https://github.com/douglascrockford/JSON-js) pour fournir une solution de secours.

3
Steve

Pour s'appuyer sur la réponse de stewe, le compilateur de fermeture avec Avancé activé vous donne un script qui pollue l'espace de noms global avec un tas de variables à une lettre. Donc, je viens de l'envelopper dans un appel de fonction anonyme comme ceci:

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

Vous pouvez maintenant appeler:

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

2
crizCraig

Souvent, la fonction JSON.stringify () n'est pas requise lors de l'utilisation de jQuery. Prenons par exemple le cas courant d'utilisation d'ajax pour envoyer des données javascript au serveur, jquery a des fonctions intégrées pour gérer cela: (exemples de 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);
});

Dans tous les exemples ci-dessus, les données javascript envoyées sont sérialisées automatiquement par jQuery.

La sérialisation dans ces cas n'est pas la même que JSON.Stringify (), mais les données sont sérialisées en une chaîne de requête html (voir: http://en.wikipedia.org/wiki/Query_string#Structure =).

Cependant, cette forme de sérialisation convient à la plupart (mais pas à toutes) les applications

1
wal5hy