web-dev-qa-db-fra.com

Comment représenter un ensemble en JSON?

JSON prend en charge les structures de données suivantes (équivalents Java): Scalar, Array/List et Map.

Un Set n'est pas pris en charge par défaut dans JSON.

J'ai pensé à plusieurs façons de représenter un ensemble en JSON:

[1] - En liste

Cependant, une liste a son propre ordre, donc les deux listes suivantes, ["a", "b"] et ["b", "a"] ne sont pas égaux en tant que listes, mais ils doivent être égaux en tant qu'ensembles.

[2] - Comme une carte

Utilisez le jeu de clés de la carte et ignorez les valeurs.

Mais encore une fois, en utilisant la comparaison standard, les deux ne sont pas les mêmes que les cartes:

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[3] - Comme une carte, avec une valeur spéciale

Prenez un scalaire, dites 0 ou null et forcez-le à être la valeur de chaque clé de la carte:

{"a": 0, "b": 0}

De cette façon, sous les outils de comparaison standard, les objets sont égaux, même si l'ordre des clés est modifié.

Cependant, cette technique pollue le document JSON avec des données non pertinentes.

[4] - En tant que liste ordonnée

Revenons à la première suggestion, mais cette fois sous forme de liste ordonnée. Ce type de solution résout le problème de comparaison.

Cependant, nous devons également garder à l'esprit la complexité du tri, et aussi que la notation de carte gère les doublons, contrairement à une liste triée. Exemple:

{"a": 400, "a": 9} est traité comme {"a": 9}, mais ["g", "g"] serait toujours ["g", "g"].

Cela dit, il me semble que la notation de liste est plus claire, mais la notation de carte est plus robuste à la duplication de clés et rend plus difficile la cohérence de la valeur spéciale (même si null semble être un bon choix pour ça).

Qu'est-ce que tu penses? Comment représenteriez-vous un ensemble en JSON?

P.S.

Notez que cette question concerne simplement JSON. Je sais que d'autres formats, comme yaml, sont disponibles. Encore...

14
Ron Klein

Tu ne peux pas. Comme vous l'avez dit, vous pouvez représenter des tableaux et des dictionnaires. Vous avez deux choix.

Représentez l'ensemble comme un tableau. Avantage: la conversion de l'ensemble en tableau et inversement est généralement facile. Inconvénient: un tableau a un ordre implicite, contrairement à un ensemble, donc la conversion d'ensembles identiques en tableaux JSON peut créer des tableaux qui seraient considérés comme différents. Il n'y a aucun moyen de faire en sorte que les éléments du tableau soient uniques, donc un tableau JSON peut ne pas contenir un ensemble valide (évidemment, vous pouvez simplement ignorer les doublons; c'est ce qui est susceptible de se produire de toute façon).

Représentez l'ensemble comme un dictionnaire, avec une valeur arbitraire par clé, par exemple 0 ou null. Si vous ignorez simplement les valeurs, c'est une correspondance parfaite. D'un autre côté, il se peut que vous n'ayez pas de support de bibliothèque pour extraire les clés d'un dictionnaire sous forme d'ensemble, ou pour transformer un ensemble en dictionnaire.

Dans mon environnement de programmation, la conversion entre l'ensemble et le tableau est plus facile (le tableau à définir perdra les valeurs en double, qui ne devraient pas être là ou seraient considérées comme correctes), donc pour cette raison, j'irais avec des tableaux. Mais c'est vraiment une question d'opinion.

MAIS: Il y a un gros éléphant gras dans la pièce qui n'a pas été mentionné. Les clés d'un dictionnaire JSON ne peuvent être que des chaînes. Si votre ensemble n'est pas un ensemble de chaînes, vous avez seulement le choix d'utiliser un tableau.

20
gnasher729

N'essayez pas de représenter des ensembles dans JSON. Faites-le lors de l'analyse des données à la place.

Vos données JSON doivent avoir un schéma qui spécifie quels champs doivent être traités comme un ensemble, ou vous pouvez avoir des métadonnées incorporées dans les données JSON elles-mêmes qui décrivent quand une liste doit être traitée comme un ensemble (par exemple {"houses": {"_type": "set", "value": [...]}}) ou avec une convention de dénomination.

Notez que selon la norme JSON, un objet JSON peut avoir des clés en double. Formulations ECMA-404:

Objets

[...] La syntaxe JSON n'impose aucune restriction sur les chaînes utilisées comme noms, n'exige pas que les chaînes de nom soient uniques et n'accorde aucune signification à l'ordre des paires nom/valeur. Ce sont toutes des considérations sémantiques qui peuvent être définies par des processeurs JSON ou dans des spécifications définissant des utilisations spécifiques de JSON pour l'échange de données.

AFAICD, rien dans la spécification n'interdit les noms non uniques, et il existe de nombreuses implémentations de l'analyseur JSON qui peuvent analyser les noms d'objets non uniques. La RFC 7159 décourage l'interopérabilité des noms non uniques, mais ne l'interdit pas non plus, et énumère comment divers analyseurs ont été vus manipulant des noms d'objets non uniques.

Et ECMA 404 n'exige pas non plus que l'ordre des tableaux soit préservé:

Tableaux

La syntaxe JSON ne définit aucune signification spécifique à l'ordre des valeurs. Cependant, la structure du tableau JSON est souvent utilisée dans des situations où il y a une certaine sémantique dans l'ordre.

Cette formulation permet aux applications d'utiliser des tableaux pour représenter des ensembles s'ils le souhaitent.

3
Lie Ryan