2009-02-19 9 views
3

Sur JSON.org les structures de données essentielles que représente JSON sont donnés à titredans à répétitions JSON

  1. Une collection de paires nom/valeur et
  2. Une liste ordonnée de valeurs.

Je n'ai pas été en mesure de trouver n'importe où un second membre ayant le même nom que celui déjà analysé dans l'objet actuel devrait (a) lancer une exception ou (b) remplacer le membre existant.

Est-ce spécifié quelque part?

Que font les analyseurs existants avec des noms répétés?

EDIT: Je cherche à définir un comportement correct pour mon analyseur.

Répondre

3

JSON est simplement un sous-ensemble de l'objet notation littérale de JavaScript et en tant que telle, est limitée par les mêmes règles - la dernière valeur pour les touches répétées aura préséance sur toute valeur attribuée précédemment pour cette clé, dans l'objet spécifique . Pensez en termes d'attribution d'une valeur à une propriété d'objet; Une affectation ultérieure remplacera une précédente.

Pour le démontrer, j'ai mis en place un example here. Le code est affiché sur la page, et comme on peut le voir, la boîte de message porte le nom «Barney».

code

ici -

$(function() { 

    $('#myButton').click(function(e) 

    { 

    var myJsonString = "Person = {'firstName':'Fred','lastName':'Flintstone','firstName':'Barney'}"; 

    eval("(" + myJsonString + ")"); 

    alert(Person.firstName); 

    }); 

}); 

By the Way, je l'ai utilisé eval() ici pour la facilité d'utilisation. Je recommanderais d'utiliser un analyseur JSON au lieu de eval() en raison de problèmes de sécurité.

+0

Je suis d'accord pour ne pas utiliser eval(). J'utilise en fait JSON en Java et donc purement comme une encapsulation de données, sans compter le code. –

+0

BTW, merci pour une excellente réponse; Je me sens coupable de ne pas penser à simplement tester cela dans JS moi-même ... problème de programmation presque exclusivement en Java, je suppose. –

+0

Pas de problème. Je recommande fortement http://jsbin.com/ pour tester des extraits de HTML, CSS et JavaScript.Il vous permet d'inclure facilement les bibliothèques JS courantes et d'enregistrer votre code dans une URL publique. Combiné avec firefox, c'est un bijou absolu de tester des idées avec –

-1

Parce que JSON est simplement un sous-ensemble de Javascript, cela dépend largement de la spécification Javascript. Je ne sais pas personnellement quelle est la réponse, mais je suggère fortement de ne pas compter sur le comportement si possible.

1

Le nom de famille trouvé par l'analyseur est remplacé par le nouveau. Il ne lance pas d'attente.

C'est simplement une chose de syntaxe Javascript.

var json = {}; 

// lets augment the object 
json.one = 1; 
json.one = 2; // it gets replaced 
+0

Qu'est-ce qui ne génère pas d'exception? L'OP ne spécifie pas d'outil. Voulez-vous dire que Javascript ne jette pas une exception? –

0

Je suis assez sûr que les deux comportements que vous listez seraient acceptés, ainsi que d'autres (utilisez le premier, utilisez l'un d'entre eux). :-) Autrement dit, un tel comportement n'est pas défini à partir de la spécification JSON POV.

En pratique, les implémentations que j'ai utilisées font l'une des suggestions que vous avez mentionnées, ou "utiliser la première". Donc non, je ne compterais pas sur un comportement spécifique étant donné que les outils peuvent choisir quoi faire.

+0

Ouais, j'ai fini par faire de mon analyseur une exception, par défaut, mais j'ai ajouté une option d'analyse qui traite les mots-clés répétés comme un tableau; Je considère une autre option pour stipuler le comportement de remplacement à la place. –