2010-08-29 6 views
77

Au lieu de partir d'une chaîne json et d'utiliser $ .parseJSON, j'ai besoin de prendre mon objet et de le stocker dans une variable sous forme de chaîne représentant json.jquery json à corder?

(Une bibliothèque que je traite attend un type JSON malformé donc je dois mess avec lui pour le faire fonctionner.)

Quelle est la meilleure façon de le faire?

+1

double possible de [sérialisation JSON dans jQuery] (http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – Wolph

+0

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

+0

La bibliothèque de cryptographie JavaScript de Stanford génère et analyse des fichiers JSON malformés, le bogue est mis en œuvre en ce moment. – Incognito

Répondre

84

Édition: Vous devez utiliser la bibliothèque json2.js de Douglas Crockford au lieu d'implémenter le code ci-dessous. Il fournit des fonctionnalités supplémentaires et une meilleure prise en charge du navigateur.

Prenez le fichier 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"}' 

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

+23

Je recommanderais la bibliothèque [json2.js] (http://www.json.org/json2.js) à la place de cette fonction, car elle ne gère pas correctement certains types, comme les propriétés contenant des fonctions 'undefined', (qui ne sont pas des valeurs JSON valides), des objets booléens (par exemple 'new Boolean (true);'), ou 'NaN' qui devrait être remplacé par' null', etc ... aussi il ne supporte pas l'option optionnelle arguments, la fonction 'replacer' et le nombre' spaces' pour l'indentation, qui sont [entièrement décrits] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.12.3) dans la norme. – CMS

+3

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

+5

La plupart des navigateurs ont un objet JSON natif ces jours-ci, qui comprend des méthodes parse et stringify. Donc, essayez simplement '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 jolies impressions, par ex. 'JSON.stringify ({a: 1, b: 2}, null, 2)' met un saut de ligne et 2 espaces devant chaque clé. – AlexChaffee

0

Vous pouvez analyser le JSON sur un objet, puis créer votre JSON mal formé à partir de l'objet ajavscript. Ce n'est peut-être pas le meilleur des performances, tho. Sinon, si vous avez seulement besoin de faire de très petits changements à la chaîne, il suffit de la traiter comme une chaîne, et de la modifier en utilisant javascript standard.

39

J'utilise

$.param(jsonObj) 

qui me reçoit la chaîne.

+8

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

+22

mais ce petit code fait tout le titre des requêtes question: P –

10

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

+2

pourquoi n'est-ce pas une bonne réponse? – VDP

+1

parce que c'est un jquery _plugin_ & non ce qui est directement fourni par jquery –

+0

@ user01 mais jquery ne comprend pas un moyen de le faire (au moins, il n'a pas quand j'ai écrit cette réponse, je ne sais pas si elle le fait maintenant) –

34

La plupart des navigateurs ont un objet JSON natif ces jours-ci, qui comprend parse et stringify méthodes. Donc, essayez simplement JSON.stringify({}) et voyez si vous obtenez "{}". Vous pouvez même passer des paramètres pour filtrer les clés ou pour faire de jolies impressions, par ex. JSON.stringify({a:1,b:2}, null, 2) met une nouvelle ligne et 2 espaces devant chaque touche.

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

donne

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

qui imprime comme

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

Quant à la déconner partie de votre question, utilisez le second paramètre. De http://www.javascriptkit.com/jsref/json.shtml:

Le paramètre de remplacement peut être soit une fonction ou d'un tableau de nombres cordes /. Il passe par chaque membre de l'objet JSON à pour vous permettre de décider de la valeur de chaque membre. En fonction il peut retourner:

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

Comme un tableau, les valeurs définies à l'intérieur correspond aux noms de les propriétés à l'intérieur de l'objet JSON qui doivent être conservés lorsque converti en un objet JSON.