79 votes

jQuery JSON to string ?

Au lieu d'aller chercher une chaîne JSON et d'utiliser $.parseJSON, j'ai besoin de prendre mon objet et de le stocker dans une variable sous la forme d'une chaîne représentant JSON.

(Une bibliothèque avec laquelle je travaille s'attend à un type JSON malformé et je dois donc la manipuler pour qu'elle fonctionne).

Quelle est la meilleure façon de procéder ?

1 votes

Duplication possible de Sérialisation vers JSON dans jQuery

0 votes

Quelle bibliothèque attend une chaîne JSON malformée ? :/

0 votes

La bibliothèque de cryptographie JavaScript de Stanford produit et analyse du JSON malformé, le bogue est actuellement travaillé.

84voto

Inigoesdr Points 1350

Editer : Vous devriez utiliser la bibliothèque json2.js de Douglas Crockford au lieu d'implémenter le code ci-dessous. Elle offre des fonctionnalités supplémentaires et une meilleure prise en charge des navigateurs plus anciens.

Récupérez le fichier json2.js à partir 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"}'

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

23 votes

Je recommanderais le json2.js au lieu de cette fonction, parce qu'elle ne gère pas correctement certains types, comme les propriétés contenant du undefined les fonctions (qui ne sont pas des valeurs JSON valides), les objets booléens (par ex. new Boolean(true); ), ou NaN qu'il convient de remplacer par null etc... il ne prend pas non plus en charge les arguments optionnels supplémentaires, l'option replacer et la fonction spaces pour l'indentation, qui sont entièrement décrite dans la norme.

3 votes

Je pense que le lien json2 devrait être : github.com/douglascrockford/JSON-js/blob/master/json2.js

5 votes

La plupart des navigateurs disposent aujourd'hui d'un objet JSON natif, qui comprend des méthodes de parse et de stringify. Il suffit donc d'essayer JSON.stringify({}) et voyez si vous obtenez "{}" sans avoir besoin d'inclure le code ci-dessus. Vous pouvez même passer des paramètres pour filtrer les clés ou pour faire de la "pretty-printing", par exemple JSON.stringify({a:1,b:2}, null, 2) place une nouvelle ligne et deux espaces devant chaque touche.

38voto

jonathan Points 347

J'utilise

$.param(jsonObj)

ce qui me permet d'obtenir la chaîne.

8 votes

Mais cela ne crée pas de JSON (et c'était la question).

22 votes

Mais ce petit code fait tout ce que demande le titre de la question :P

35voto

AlexChaffee Points 2979

La plupart des navigateurs disposent d'une fonction JSON Aujourd'hui, l'objet de l'assurance maladie comprend les éléments suivants parse y stringify des méthodes. Il suffit donc d'essayer JSON.stringify({}) et voyez si vous obtenez "{}" . Vous pouvez même passer des paramètres pour filtrer les clés ou pour faire de l'impression, par exemple. JSON.stringify({a:1,b:2}, null, 2) place une nouvelle ligne et deux espaces devant chaque touche.

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

donne

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

qui s'imprime comme suit

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

Pour ce qui est de la partie de votre question qui concerne le désordre, utilisez le deuxième paramètre. A partir de http://www.javascriptkit.com/jsref/json.shtml :

Le paramètre de remplacement peut être soit b chaînes de caractères/nombres. Il passe en revue chaque membre de l'objet JSON pour pour vous permettre de décider de la valeur de chaque membre. En tant que il peut renvoyer :

  • Un nombre, une chaîne ou un booléen, qui remplace la valeur originale de la propriété par la valeur renvoyée.
  • Un objet, qui est sérialisé puis renvoyé. Les méthodes ou fonctions d'objets ne sont pas autorisées et sont supprimées à la place.
  • Null, ce qui entraîne la suppression de la propriété.

En tant que tableau, les valeurs définies à l'intérieur correspondent aux noms de des propriétés de l'objet JSON qui doivent être conservées lors de la converti en objet JSON.

10voto

David Reynolds Points 716

La meilleure façon que j'ai trouvée est d'utiliser jQuery JSON

1 votes

Parce qu'il s'agit d'une application jquery plugin & pas ce qui est directement fourni par jquery

0 votes

@user01 mais jquery n'inclut pas de moyen de faire cela (du moins il ne le faisait pas quand j'ai écrit cette réponse, je ne suis pas sûr qu'il le fasse maintenant).

0 votes

@DavidReynolds : oui bien sûr, je comprends :) Je n'avais pas l'intention de vous offenser, mais j'ai juste commenté cela comme une solution au problème :)

0voto

cofiem Points 1045

Vous pourriez analyser le JSON en un objet, puis créer votre JSON malformé à partir de l'objet ajavscript. Ce n'est peut-être pas la meilleure solution du point de vue des performances.

Sinon, si vous n'avez besoin que d'apporter de très petites modifications à la chaîne, traitez-la simplement comme une chaîne, et manipulez-la à l'aide du javascript standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X