jquery json a cadena?

79

En lugar de pasar de una cadena json y usar $ .parseJSON, necesito tomar mi objeto y almacenarlo en una variable como una cadena que representa a json.

(Una biblioteca con la que estoy tratando espera un tipo json con formato incorrecto, por lo que necesito jugar con él para que funcione).

¿Cuál es la mejor manera de hacer esto?

Incógnito
fuente
1
posible duplicado de serializar a JSON en jQuery
Wolph
¿Qué biblioteca espera una cadena JSON con formato incorrecto? : /
Marcel Korpel
La biblioteca de criptografía de JavaScript de Stanford genera y analiza JSON con formato incorrecto, el error se ha solucionado en este momento.
Incógnito

Respuestas:

84

Editar: debe usar la biblioteca json2.js de Douglas Crockford en lugar de implementar el código a continuación. Proporciona algunas funciones adicionales y compatibilidad con navegadores mejores o más antiguos.

Coge el archivo json2.js de: https://github.com/douglascrockford/JSON-js


// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

var tmp = {one: 1, two: "2"};
JSON.stringify(tmp); // '{"one":1,"two":"2"}'

Código de: http://www.sitepoint.com/blogs/2009/08/19/javascript-json-serialization/

Iñigoesdr
fuente
23
Recomendaría la biblioteca json2.js en lugar de esta función, porque no maneja correctamente algunos tipos, como propiedades que contienen undefined, funciones (que no son valores JSON válidos), objetos booleanos (por ejemplo new Boolean(true);), o NaNque deberían ser reemplazados with null, etc ... tampoco admite los argumentos opcionales adicionales, la replacerfunción y el spacesnúmero de sangría, que se describen completamente en el estándar.
Christian C. Salvadó
3
Creo que quizás el enlace json2 debería ser: github.com/douglascrockford/JSON-js/blob/master/json2.js
fisherwebdev
5
La mayoría de los navegadores tienen un objeto JSON nativo en estos días, que incluye métodos de análisis y cadena de caracteres. Así que intente JSON.stringify({})ver si lo obtiene "{}"sin necesidad de incluir el código anterior. Incluso puede pasar parámetros para filtrar claves o para hacer impresiones bonitas, por ejemplo, JSON.stringify({a:1,b:2}, null, 2)poner una nueva línea y 2 espacios delante de cada tecla.
AlexChaffee
Para aquellos que buscan una respuesta moderna: JSON.stringify (); está implementado en todos los navegadores (escritorio y móvil): developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Pablo Martinez
38

yo suelo

$.param(jsonObj)

que me da la cuerda.

Jonathan
fuente
8
Pero esto no crea JSON (y esa era la pregunta).
Felix Kling
22
pero este pequeño código está haciendo todo el título de las solicitudes de preguntas: P
nils petersohn
35

La mayoría de los navegadores tienen un JSONobjeto nativo en estos días, que incluye parsey stringifymétodos. Así que trata de JSON.stringify({})ver si lo consigues "{}". Incluso puede pasar parámetros para filtrar claves o para hacer impresiones bonitas, por ejemplo, JSON.stringify({a:1,b:2}, null, 2)poner una nueva línea y 2 espacios delante de cada tecla.

JSON.stringify({a:1,b:2}, null, 2)

da

"{\n  \"a\": 1,\n  \"b\": 2\n}"

que se imprime como

{
  "a": 1,
  "b": 2
}

En cuanto a la parte desordenada de su pregunta, use el segundo parámetro. De http://www.javascriptkit.com/jsref/json.shtml :

El parámetro de reemplazo puede ser una función o una matriz de String / Numbers. Recorre cada miembro dentro del objeto JSON para permitirle decidir a qué valor debe cambiarse cada miembro. Como función, puede devolver:

  • Un número, cadena o booleano, que reemplaza el valor original de la propiedad por el devuelto.
  • Un objeto, que se serializa y luego se devuelve. Los métodos o funciones de objeto no están permitidos y, en su lugar, se eliminan.
  • Nulo, que hace que se elimine la propiedad.

Como matriz, los valores definidos en su interior corresponden a los nombres de las propiedades dentro del objeto JSON que deben conservarse cuando se convierten en un objeto JSON.

AlexChaffee
fuente
10

La mejor forma que he encontrado es usar jQuery JSON

David Reynolds
fuente
1
porque es un complemento de jquery y no lo que proporciona directamente jquery
Rajat Gupta
@ user01 pero jquery no incluye una forma de hacer esto (al menos no lo hizo cuando escribí esta respuesta, no estoy seguro si lo hace ahora)
David Reynolds
@DavidReynolds: sí, por supuesto, lo entiendo :) No tenía la intención de ofenderte, solo comenté esto como una solución al problema :)
Rajat Gupta
0

Puede analizar el JSON en un objeto y luego crear su JSON con formato incorrecto a partir del objeto ajavscript. Sin embargo, este puede no ser el mejor en cuanto a rendimiento.

De lo contrario, si solo necesita hacer cambios muy pequeños en la cadena, simplemente trátela como una cadena y muévala usando javascript estándar.

cofiem
fuente