7
votes

Tableau JSON avec des propriétés

J'ai le tableau / objet JS suivant xxx

J'utilise json2.js et j'essaie de sérialiser x dans une chaîne. Et tout ce que je reçois est le tableau: [1,2,3,4]

est-ce correct? Puisque je peux ajouter n'importe quelle propriété à un tableau Pourquoi JSON2 ne gère pas cela? Qu'est-ce que je manque?


4 commentaires

Qu'est-ce que vous essayez de faire?


Vous ne pouvez pas ajouter de propriété à un tableau. Les tableaux sont des cartes d'indices numériques aux valeurs. Techniquement, dans JavaScript, vous pouvez ajouter n'importe quelle propriété à un objet ou à un objet car ils sont construits sur le type objet , bien que vous n'êtes pas vraiment censé. Quelle est votre intention?


Pourquoi surcharger le tableau? juste faire var x = {}; x.array = [1,2,3,4]; x.name = "myarray"; ou le faire JSON pour commencer avec: var x = {"nom": "myarray", "tableau": [1,2,3,4]}


Vous pouvez ajouter n'importe quelle propriété nommée à un tableau. C'est juste qu'il n'y a pas de syntaxe d'initialisation dans JS pour créer un tableau avec de telles propriétés nommées, et JSON n'est que la syntaxe d'initialisation de JS.


4 Réponses :


2
votes

Qu'est-ce que vous attendiez-vous? :) Je ne suis pas sûr de ce que vous essayez de faire.

x est une matrice et tout ce que vous avez fait lorsque vous avez fait x.name , vous définissez simplement une propriété appelée Nom pour l'objet Array. Le nom nom n'est pas ajouté à la matrice. Vous pouvez voir cela en Firebug:

Entrez la description de l'image ici

L'objet Array a une propriété appelée nom , mais la valeur de cette propriété n'est pas ajoutée à la matrice elle-même.

Ce que vous voulez faire est quelque chose comme ceci: xxx

Vous avez maintenant un objet appelé x qui a deux propriétés. La propriété TRAY fait référence à une matrice, et la propriété nom fait référence au nom. x.array vous donnera la matrice, et x.name vous donnera le nom.

edit

Ceci est en réponse à vos commentaires. Bien qu'il soit vrai que les matrices peuvent être enrichies de propriétés, réfléchissez à ce que cela signifie lorsque vous devez sérialiser cet objet. Que voulez-vous voir exactement lorsque vous serialisez x ? Si x est déjà le tableau [1, 2, 3, 4] , comment le représenteriez-vous dans JSON? Vous pouvez le représenter comme suit: xxx

mais ce que vous avez maintenant n'est plus un tableau. En outre, l'objet Array lui-même a un tas de propriétés natales. Comment un sérialiseur JSON devrait-il gérer ceux-ci?

Je pense que vous mélangez un tableau en tant qu'objet et un tableau comme littéral. Un tableau comme littéral est juste [1, 2, 3, 4] . Maintenant, la matrice en tant que objet présente probablement des biens qui indiquent la valeur réelle de la matrice. Il a également d'autres propriétés (comme longueur ) et des méthodes qui y agissent (comme tranche ).

Le sérialisateur JSON concerne la valeur de l'objet. Si x est une matrice, la chose qui doit être sérialisée est la valeur de x , qui est [1, 2, 3, 4] . Les propriétés de x sont totalement différentes.

Si vous souhaitez sérialiser ces propriétés supplémentaires, vous devrez écrire votre propre sérieliseur qui ira itération sur les propriétés du tableau et Représenter tout dans une carte / une matrice associative. C'est le seul moyen; La mise en garde, comme je l'ai déjà mentionnée, est que vous n'avez plus de matrice réelle.


4 commentaires

AVERTISSEMENT DE PONDANCE: C'est juste un objet. L'objet littéral est le moyen par lequel vous avez créé.


@Tim va réparer. Désolé, mes termes ont mélangé!


La matrice peut être enrichie de propriétés. Dans certaines situations, c'est très bénéfique. Il n'y a aucun point ici pour dire les situations. Disons qu'ils ne sont pas la norme. Néanmoins, je me rends compte que les tableaux enrichis ne sont pas JSON, qui, à mon avis, est une honte.


x = {tableau: [1,2,3,4], nom = "test"} est complètement différent de x = [1,2,3,4]; x.name = 'Test'; Alors pourquoi insister?



0
votes

Le problème est que JSON2 croit toujours que c'est un tableau depuis instance de graphique de x renvoie true. Pour le réparer, vous pouvez créer le "tableau" de manière rond-point: xxx

Le problème avec cette solution est qu'aucune des méthodes de réseau ne sera disponible sur l'objet. Donc, si vous avez besoin d'utiliser POP, poussez, etc., vous devrez le convertir en un réseau réel avec array.pototype.slice.call (x); ou si vous êtes Ayte faim []. Slice.call (x); .


0 commentaires

0
votes

Je ne sais pas pourquoi vous le feriez, mais un pour une boucle pour obtenir tout xxx

produit: xxx

mais json2 code ne le verra pas de cette façon, pourquoi ne pas la convertir à un objet?


1 commentaires

Parce que le tableau enrichi est transmis à moi et je dois le persister. Je suppose que je pourrais le convertir avant de le persister et quand je les désériorialiser.



4
votes
  1. Tout d'abord JSON2.JS ignore les propriétés dans le tableau.
  2. S'il n'avait pas à les ignorer, il serait impossible d'avoir un tableau au format JSON qui devrait être facile à évaluer.

    Imaginons que nous sortons avec quelque chose comme: xxx

    si ce qui précède était valide JavaScript pour créer un tableau et coller deux propriétés alors ce serait génial et nous pourrions JSON -ce. Il serait équivalent de faire ceci: xxx

    mais ce n'est pas et c'est la raison pour laquelle nous ne pouvons pas persister dans JSON.


0 commentaires