web-dev-qa-db-fra.com

Le meilleur moyen de convertir une chaîne en tableau d'objets en javascript?

Je veux convertir la chaîne ci-dessous à un tableau en javascript.

{a:12, b:c, foo:bar}

Comment convertir cette chaîne en tableau d'objets? Une bonne idée?

28
Zeck

Je pense que la meilleure façon de le faire, comme Douglas Crockford (l'un des plus grands gourous de JavaScript) suggère ici utilise le l'analyseur JSON natif , car ce n'est pas seulement plus rapide que eval (), il est également plus sécurisé.

Un analyseur JSON natif est déjà disponible dans:

  • Firefox 3.5+
  • IE 8+
  • Opera 10.5+
  • Safari Safari 4.0.3+
  • Chrome (ne sait pas quelle version)

Et Crockford a effectué un repli sécurisé de javascript, appelé json2.js , qui est une adaptation de l'approche eval (), avec quelques éléments de sécurité ajoutés et avec l'API de l'analyseur JSON natif. Il vous suffit d’inclure ce fichier, de supprimer sa première ligne et d’utiliser l’analyseur JSON natif. Si ce n’est pas le cas, json2 fera le travail.

Voici un exemple:

var myJSONString = '{ "a": 1, "b": 2 }',
    myObject = JSON.parse(myJSONString);

Une fois analysé, vous obtiendrez un objet avec les attributs a et b et, comme vous le savez peut-être, vous pouvez traiter un objet comme une table de hachage ou un tableau associatif en JavaScript. Vous pourrez ainsi accéder aux valeurs de ce type. : 

myObject['a'];

Si vous voulez juste un tableau simple et pas un tableau associatif, vous pouvez faire quelque chose comme:

var myArray = [];
for(var i in myObject) {
    myArray.Push(myObject[i]);
}

Enfin, bien que cela ne soit pas nécessaire en JavaScript simple, la spécification JSON requiert une double citation de la clé des membres. Donc, l'analyseur navite ne fonctionnera pas sans cela. Si j'étais vous, je l'ajouterais, mais si ce n'est pas possible, utilisez l'approche var myObject = eval( "(" + myString + ")" );.

79
alcuadrado

Puisque votre chaîne est malformed JSON, un analyseur JSON ne peut pas l’analyser correctement et même eval () émettra une erreur. Ce n'est pas non plus un tableau, mais un tableau de hachage ou simplement un littéral d'objet (malformé). Si le littéral Object ne contient que des valeurs de nombre et de chaîne (et aucun objet/tableau enfant), vous pouvez utiliser le code suivant.

function malformedJSON2Array (tar) {
    var arr = [];
    tar = tar.replace(/^\{|\}$/g,'').split(',');
    for(var i=0,cur,pair;cur=tar[i];i++){
        arr[i] = {};
        pair = cur.split(':');
        arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
    }
    return arr;
}

malformedJSON2Array("{a:12, b:c, foo:bar}");
// result -> [{a:12},{b:'c'},{foo:'bar'}]

Ce code transformera votre chaîne en tableau d'objets (pluriel).

Si toutefois vous vouliez réellement un HashMap (tableau associatif) et NON un tableau, utilisez le code suivant:

function malformedJSON2Object(tar) {
    var obj = {};
    tar = tar.replace(/^\{|\}$/g,'').split(',');
    for(var i=0,cur,pair;cur=tar[i];i++){
        pair = cur.split(':');
        obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
    }
    return obj;
}

malformedJSON2Object("{a:12, b:c, foo:bar}");
// result -> {a:12,b:'c',foo:'bar'}

Le code ci-dessus deviendra beaucoup plus complexe lorsque vous commencerez à imbriquer des objets et des tableaux. En gros, vous devez réécrire JSON.js et JSON2.js pour prendre en charge les fichiers JSON mal formés.

Pensez également à l'option suivante, qui est toujours mauvaise, je l'admets, mais légèrement meilleure que de coller du JSON dans l'attribut d'une balise HTML.

<div id="DATA001">bla</div>
<!-- namespacing your data is even better! -->
<script>var DATA001 = {a:12,b:"c",foo:"bar"};</script>

Je suppose que vous omettez les guillemets dans la chaîne parce que vous l'avez placé dans l'attribut d'une balise HTML et que vous ne voulez pas échapper aux guillemets.

9
BGerrissen

Le moyen le plus simple mais dangereux de le faire est:

eval('(' + myJSONtext + ')')

Mais puisque ceci interprétera tout code javascript, il comporte des failles de sécurité. Pour vous protéger contre cela, utilisez un analyseur JSON. Si vous utilisez un framework (jquery, mootools, etc.), il existe un appel spécifique à ce framework. La plupart d'entre elles sont basées sur l'analyseur syntaxique de Douglas Crawford disponible à l'adresse http://www.json.org/js.html .

7
Rob

Vous pouvez utiliser "pour dans"

var myObject = {a:'12', b:'c', foo:'bar'};
var myArray = [];

for(key in myObject) {
    var value = myObject[key];
    myArray[key] = value;
}

myArray['a']; // returns 12

Remarques: en considérant que myObject ne possède qu'un seul niveau de paires clé-valeur.

2
Topera

Si vous utilisez jQuery, il existe la fonction $ .parseJSON () . Il lève une exception si la chaîne est mal formée et "En outre, si vous ne transmettez rien, une chaîne vide, nulle ou non définie," null "sera renvoyée par parseJSON. Lorsque le navigateur fournit une implémentation native de JSON.parse, jQuery l'utilise pour analyser la chaîne "

1
jamiebarrow

JSON.parse fera l'affaire. Une fois analysés, vous pouvez les insérer dans le tableau.

var object = JSON.parse(param);
var array = [];
for(var i in object) {
   array.Push(object[i]);
}
0
Sarathi S