2010-02-17 6 views
74

Aparentemente, jQuery tiene la capacidad de decodificar un objeto o cadena dado en un objeto JSON. Sin embargo, tengo un objeto JS que necesito enviar de regreso al servidor y no encuentro utilidad en jQuery que envuelva la función JSON.stringify(). Esa función se encuentra en Chrome, Safari 4, FF3.6 e IE8, pero no se encuentra en los navegadores anteriores. Puedo usarlo de forma nativa en los navegadores que lo soportan, pero de lo contrario me veo obligado a recurrir al uso de las secuencias de comandos JSON de Crockford.JSON stringify falta de jQuery 1.4.1?

¿Hay alguna función incorporada con jQuery que maneje la codificación JSON y la descodificación que toma el lugar de los scripts de Crockford?

+3

puesto similar: http: // stackoverflow.com/questions/191881/serializing-to-json-in-jquery – sberry

+0

Quizás soy muy tonto, pero esto fue una completa sorpresa para mí también. Parece que el guión de JSON.org es el camino a seguir. – KevinM

Respuesta

30

Es posible que desee comprobar esto: http://www.json.org/js.html

+10

Sí, es un poco triste que jQuery no haya agregado un método para hacerlo directamente a la biblioteca. Terminé minificando json.js con el compilador Closure y lo puse en la parte inferior de mi archivo js donde estoy trabajando. Hará el truco, pero parece innecesario. – Geuis

+0

he estado usando http://code.google.com/p/jquery-json/ solution. Funciona bien para mí – crsuarezf

14

jQuery puede decodificar cadenas JSON nativa con jQuery.parseJSON().

Para la codificación sin embargo, yo sólo sé de un plugin: jquery-json

+2

¿Qué hay de malo con el uso de JSON.stringify directamente? – zcrar70

+1

@ zcrar70, específicamente solicita un contenedor 'JSON.stringify' .. a menos que su comentario sea para el OP. –

+0

y así lo hizo, mis disculpas. – zcrar70

26

puede utilizar "Biblioteca de Cierre" (Google) para hacer un navegador cruz JSON codificador/decodificador.

apenas van a http://closure-compiler.appspot.com/

e introduzca lo siguiente en el campo de texto, después haga clic en "Compilar":

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

Creo que 'serialize' debe cambiarse a' stringify' para reutilizar la función nativa de los navegadores si está disponible – Tomas

+1

renombrado como JSON.serialize a JSON.stringify – stewe

+0

como este enfoque. –

3

jQuery no necesita esta funcionalidad interna y por lo tanto no proporciona un método conveniente para hazlo.

JSON.stringify() es la forma estándar y recomendada de codificar un objeto a una representación de cadena JSON de ese objeto. Es un método del objeto JSON nativo en muchos navegadores, y se recomienda que use json2.js (https://github.com/douglascrockford/JSON-js) para proporcionar una alternativa.

1

A menudo, la función JSON.stringify() no es necesaria cuando se utiliza jQuery. Tomemos por ejemplo el caso común de usar ajax para enviar javascript datos al servidor, jQuery se ha incorporado en funciones para manejar esto: (ejemplos 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); 
}); 

En todos los ejemplos anteriores los datos javascript enviado es serializado por jQuery automáticamente.

La serialización en estos casos no es lo mismo que JSON.Stringify(), en cambio los datos se serializan en una cadena de consulta html (vea: http://en.wikipedia.org/wiki/Query_string#Structure).

Sin embargo esta forma de serialización es suficiente para la mayoría (pero no todas) las aplicaciones

2

Para construir sobre la respuesta de Stewe, compilador de cierre con avanzada encendido le da un script que contamina el espacio de nombres global con un grupo de una letra de variables Por lo tanto, sólo lo envuelve en una llamada de función anónima, así:

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

Ahora puede llamar:

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