Quel format JSON est un meilleur choix pour les paires de valeurs clés et pourquoi?
[{"key1": "value1"}, {"key2": "value2"}]
Ou:
[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]
Ou:
{"key1": "value1", "key2": "value2"}
La première variante semble plus compacte et plus "sémantiquement significative". La deuxième variante semble plus uniformément structurée, ce qui pourrait aider à la traiter. La 3e variante semble encore plus sémantique.
Les paires de valeurs clés seront utilisées pour attacher des données arbitraires à un autre élément. Les données doivent être sérialisées en JSON pour les arrondir via un système.
Que vous choisissiez la première ou la troisième option dépend de votre cas d'utilisation. Si vous modélisez de nombreuses instances différentes du même type de chose, choisissez la première. Par exemple, vous avez une liste de personnes. Si vous modélisez de nombreux attributs différents d'une chose, choisissez la troisième. Vous pouvez avoir des touches répétées dans le premier format, mais pas dans le troisième.
La deuxième option est terrible, et je n'ai pas encore trouvé de cas d'utilisation approprié. La raison pour laquelle c'est terrible, en plus d'être plus verbeux, c'est que pour le JSON à un niveau, il rompt la conversion automatique de la plupart des bibliothèques en dictionnaire/carte. Pour JSON profondément imbriqué, il casse l'interface de requête de type XPath .
Cela rend difficile de travailler avec. Et si vous ne connaissez pas vos clés au moment de la compilation, vous voudrez un dictionnaire ou une interface XPath, car vous ne pourrez pas le convertir en classe. Cela peut ne pas sembler être un gros problème maintenant, mais plus vous avez de format de données, plus il sera difficile de changer.
Vous dites que ce sont des paires clé/valeur. Dans ce cas, utilisez # 3: dictionnaire de paires clé/valeur.
Si ce sont des paires clé/valeur pas, alors ne les appelez pas "clés" et "valeurs" et utilisez # 2, un tableau de dictionnaires au contenu arbitraire.
La structure n ° 1 est juste stupide à moins que vous ayez besoin de paires clé/valeur mais aussi de leur ordre. Ce que vous faites rarement.
Le 3ème format est en général le meilleur. Cependant, voici un exemple de quelque chose qui convient au 1er format:
[{
"username": "foo",
"id": 1
}, {
"username": "bar",
"id": 2
}, {
"username": "baz",
"id": 3
}]
Ici, chaque objet se réfère à un chose distincte (et chaque objet utilise les mêmes clés que les autres, donc ils ne peuvent pas être fusionnés). Cependant, chaque objet de la liste est stocké en tant que { "username": "foo", "id": 1 }
plutôt que [{ "username": "foo" }, { "id": 1 }]
parce que 1) il est plus court et 2) il fait référence à une chose avec un nom d'utilisateur et un identifiant, pas une chose avec un nom d'utilisateur et une autre chose avec un identifiant.
Le problème avec la deuxième option est qu'elle devient très verbeuse à la fois en JSON et avec laquelle travailler. Cependant, il peut être utilisé si vous devez stocker des méta-informations sur la propriété. Un exemple:
{
"key": "foo",
"value": 1,
"mutable": true
}
Ici mutable
fait référence à un cas hypothétique de savoir si vous pouvez modifier la propriété elle-même, pas l'objet parent. Des méta-informations comme celle-ci sont similaires à Object.defineProperty
, qui stocke des informations "configurables", "énumérables" et "inscriptibles" sur une propriété.
Mettez-vous à la place de la personne qui reçoit le json. Si je ne connais pas le nom de la clé, comment dois-je le récupérer avec le premier ou le dernier format? Vous pouvez parcourir le json bien sûr, mais comme les trois formats atteignent le même résultat, ce n'est qu'une question de syntaxe. Je pense que c'est la seule question pertinente: si vous connaissez les noms des clés, la première ou la dernière option sont plus compactes, sinon le deuxième choix est plus compréhensible.