2010-02-13 6 views
58

J'utilise un objet JS pour créer des graphiques avec la visualisation Google. J'essaie de concevoir la source de données. Au début, j'ai créé un objet côté client JS.Chaîne JSON à l'objet JS

var JSONObject = { 
    cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
     {id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
    {c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}] 
}; 

var data = new google.visualization.DataTable(JSONObject, 0.5); 

Maintenant, j'ai besoin d'extraire les données dynamiquement. J'envoie une requête AJAX vers une page qui renvoie la chaîne JSON:

"cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
{id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}" 

Ce que j'enregistrer dans une variable:

var var1 = "cols: [{i ....... 66}]}" 

et montrent que

alert(var1); 

Maintenant, ma tâche est pour créer un objet JS à partir de cette chaîne. Cela ne fonctionne pas. Quand j'utilise un objet JS, tout fonctionne bien et je suis capable d'obtenir mon graphique requis. Maintenant, si j'essaie de mettre la même valeur de chaîne de la requête AJAX que j'ai confirmée à partir d'un message d'alerte dans un objet n, l'objet n'est pas créé correctement. S'il vous plaît laissez-moi savoir votre opinion et toute correction ou des conseils.

+1

Utilisez la méthode javascript 'eval (json_string)' pour obtenir une chaîne dans un objet json. Attention cependant, la même fonction peut être potentiellement dangereuse puisqu'elle peut également exécuter des scripts. –

+1

juste un FYI - Noms de clés et chaînes ** DOIT ** être à l'intérieur de '' '' 'dans JSON valide: http://simonwillison.net/2006/Oct/11/json/ – gnarf

+0

duplication possible de [Sérialiser à JSON dans jQuery] (http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – outis

Répondre

118

Certains navigateurs modernes ont un soutien pour l'analyse syntaxique JSON dans un objet natif:

var var1 = '{"cols": [{"i" ....... 66}]}'; 
var result = JSON.parse(var1); 

Pour les navigateurs qui ne supportent pas, vous pouvez télécharger à partir json2.js json.org pour l'analyse en toute sécurité d'un Objet JSON. Le script vérifie le support JSON natif et, s'il n'existe pas, fournit l'objet global JSON à la place. Si l'objet natif plus rapide est disponible, il quittera simplement le script en le laissant intact. Vous devez, cependant, fournir un JSON valide ou il va lancer une erreur — vous pouvez vérifier la validité de votre JSON avec http://jslint.com ou http://jsonlint.com.

+4

Pertinent: http://caniuse.com/json – JamesHalsall

5

Vous pouvez utiliser eval (jsonString) si vous faites confiance aux données de la chaîne, sinon vous devrez l'analyser correctement - vérifiez json.org pour des exemples de code.

+1

Puis-je faire confiance au contenu de l'API d'un grand site Web (Reddit)? –

3

Vous pouvez utiliser this library à partir de JSON.org pour traduire votre chaîne en un objet JSON.

var var1_obj = JSON.parse(var1); 

Ou vous pouvez utiliser la bibliothèque jquery-json ainsi.

var var1_obj = $.toJSON(var1); 
5

La chaîne de votre question n'est pas une chaîne JSON valide. De json.org website:

JSON est construit sur deux structures:

* A collection of name/value pairs. In various languages, this is 
    realized as an object, record, struct, dictionary, hash table, keyed list, or 
    associative array. 
* An ordered list of values. In most languages, this is realized as an 
    array, vector, list, or sequence. 

Fondamentalement, une chaîne JSON commence toujours par une ou l'autre {ou [. Puis, comme @Andy E et @ Cryo ont dit que vous pouvez analyser la chaîne avec json2.js ou d'autres bibliothèques. À mon humble avis, vous devriez éviter eval car il y aura un programme javascript, vous pouvez donc avoir à faire face à des problèmes de sécurité.

3

La chaîne que vous renvoyez n'est pas JSON valide. Les noms dans les objets doivent être indiqués et la chaîne entière doit être placée dans { … } pour former un objet.JSON ne peut pas non plus contenir quelque chose comme new Date(). JSON est juste un petit sous-ensemble de JavaScript qui n'a que des chaînes, des nombres, des objets, des tableaux, true, false et null.

Voir le JSON grammar pour plus d'informations.