Comment représenter un ensemble en JSON?

16

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

A Setn'est pas pris en charge prêt à l'emploi 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 égales en tant que listes, mais elles doivent être égales 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 0ou nullet 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 le ["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 cela nullsemble être un bon choix pour cela).

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

PS

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

Ron Klein
la source
1
Les ensembles ne sont pas pris en charge par JSON, cela sort du cadre. Un ensemble, ou une collection distincte et unique, existe dans le cadre de l'application. Parce que c'est une collection, il serait plus évident d'utiliser la syntaxe de la collection.
Zymus
1
Pourquoi voudriez-vous représenter des ensembles en JSON? N'oubliez pas que JSON est un format d'échange.
Andres F.
@AndresF. J'ai pensé que ce serait une bonne idée d'exprimer l'attribut d'unicité des valeurs. Je ne lierais pas JSON uniquement au format d'échange. Il peut également être utile pour le stockage de documents (comme dans MongoDB).
Ron Klein
@RonKlein Assez juste. Mais bon ... ne me lancez pas avec MongoDB: P
Andres F.
En YAML, les ensembles sont représentés comme votre option [3], mais il a une notation spéciale que JSON n'a pas.
Jasmijn

Réponses:

21

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 (vous pouvez évidemment 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.

gnasher729
la source
5
le cas de bord des non-chaînes est un bon argument contre un dictionnaire.
Ron Klein
4

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 continue en énumérant 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 si elles le souhaitent.

Lie Ryan
la source