Convention de dénomination JSON [fermé]


379

Existe-t-il une norme de nommage JSON? Je vois la plupart des exemples utilisant tous les minuscules séparés par un trait de soulignement (lower_case). Mais pouvez-vous utiliser PascalCase ou camelCase?


12
J'étais curieux de savoir ce que certains dirigeants de l'industrie ont choisi. Les API Twitter et Facebook utilisent snake_case tandis que Microsoft et Google utilisent camelCase.
Justin

2
@Justin c'est parce que Twitter utilise Ruby et Facebook utilise PHP. Ruby et PHP sont dans snake_case. Microsoft et Google utilisent bien C / .NET et Java respectivement. Oh c'est vrai .Net et Java sont peut-être dans camelCase. Tout tourne autour des conventions des langages de programmation
Abel Callejo

1
Il n'y a pas de norme, mais la convention semble être d'utiliser la norme de la technologie du système récepteur.
Martin de Hessle

1
Tous sont corrects, il n'y a pas de convention stricte pour les noms / clés dans JSON. Cependant, je recommande fortement d'éviter la casse kebab car elle n'est pas accessible par la notation dot (.) En javascript et doit être accessible en utilisant la notation array [] qui je pense est fastidieuse.
saurabh

2
Fermé car principalement basé sur l'opinion? Le PO demandait des faits concernant les capacités / limites du format, et non l'avis de personne. Il a dit "pouvez-vous" et non "devriez-vous". Peut-être que le PO ne l'a pas formulé assez clairement pour ces cinq personnes, mais il faudrait avoir une compréhension de la lecture plutôt médiocre pour ne pas comprendre ce qu'il demande.
dynamichael

Réponses:


251

Il n'y a pas de norme SINGLE, mais j'ai vu 3 styles que vous mentionnez ("Pascal / Microsoft", "Java" ( camelCase) et "C" (traits de soulignement, snake_case)) - ainsi qu'au moins un autre, kebab-casecomme longer-name).

Cela semble surtout dépendre de la formation des développeurs du service en question; ceux qui ont des antécédents en c / c ++ (ou des langues qui adoptent des noms similaires, qui incluent de nombreux langages de script, ruby, etc.) choisissent souvent une variante de soulignement; et se reposer de la même manière (Java vs .NET). La bibliothèque Jackson mentionnée, par exemple, suppose la convention de dénomination du bean Java ( camelCase)

MISE À JOUR: ma définition de "standard" est une convention UNIQUE. Ainsi, alors que l'on pourrait affirmer "oui, il existe de nombreuses normes", pour moi il y en a plusieurs Naming Conventions, dont aucune n'est "La" norme dans son ensemble. L'un d'eux pourrait être considéré comme la norme pour une plate-forme spécifique, mais étant donné que JSON est utilisé pour l'interopérabilité entre plates-formes qui peut ou non avoir beaucoup de sens.


4
Il est important de s'en tenir à l'arrière-plan des développeurs, mais JSON s'en tient à la norme Javascript. Votre première déclaration n'est pas tout à fait correcte. Mais respectez certainement les conventions de dénomination de votre équipe.
Anubian Noob

8
Il serait intéressant de voir quelques statistiques, car il y a une friction constante entre les personnes qui revendiquent une connexion entre JSON et Javascript (au-delà du simple patrimoine historique), et ceux qui pensent qu'il y a actuellement peu de choses qui connecte JSON à Javascript. J'appartiens à ce dernier camp. Mais je serais intéressé à connaître les modèles d'utilisation relative.
StaxMan

@StaxMan C # utilise PascalCase dans la majorité des cas, pas camelCase.
ArtOfCode

@ArtOfCode oui. Où veux-tu en venir? (aussi, cas pascal parfois appelé "cas de chameau supérieur")
StaxMan

@StaxMan envisageriez-vous de mettre à jour votre réponse pour inclure la mention du guide de style de
Google

402

Dans ce document Google JSON Style Guide (recommandations pour la création d'API JSON chez Google),

Il recommande que:

  1. Les noms de propriété doivent être des chaînes ASCII camelCased .

  2. Le premier caractère doit être une lettre, un trait de soulignement (_) ou un signe dollar ($).

Exemple:

{
  "thisPropertyIsAnIdentifier": "identifier value"
}

Mon équipe suit cette convention.


8
Apparemment, Google a changé les lignes directrices, rien à trouver sur les affaires de chameaux ou commençant par une lettre, _ ou $ dans le document ...
TheEye

32
@TheEye Il est toujours là, il vous suffit de cliquer sur le menu déroulant.
gdw2

5
Bon œil, @ gdw2. Pour d'autres personnes à l'avenir, c'est si vous cliquez sur le bouton fléché de Property Name Guidelines->Property Name Format->Choose meaningful property names..
Panzercrisis

3
Quelqu'un peut-il expliquer pourquoi et quand utiliser un trait de soulignement pour préfixer un nom de propriété? Une référence serait utile, pas seulement une opinion.
Sean Glover

4
citer Google n'est pas une bonne réponse. ils supportent juste une certaine convention / directive et cela semble être logique en Java car ils sont assez orientés java.
Thomas Andreè Wang

186

Prémisse

Il n'y a pas de dénomination standard des clés dans JSON . Selon la section Objets de la spécification:

La syntaxe JSON n'impose aucune restriction sur les chaînes utilisées comme noms, ...

Ce qui signifie que camelCase ou snake_case devraient fonctionner correctement .

Facteurs moteurs

Imposer une convention de dénomination JSON est très déroutant. Cependant, cela peut facilement être compris si vous le décomposez en composants.

  1. Langage de programmation pour générer du JSON

    • Python - snake_case
    • PHP - snake_case
    • Java - camelCase
    • JavaScript - camelCase
  2. JSON lui-même n'a pas de nom standard pour les clés

  3. Langage de programmation pour l'analyse JSON

    • Python - snake_case
    • PHP - snake_case
    • Java - camelCase
    • JavaScript - camelCase

Associez les composants

  1. Python »JSON» Python - snake_case - unanime
  2. Python »JSON» PHP - snake_case - unanime
  3. Python »JSON» Java - snake_case - veuillez voir le problème Java ci-dessous
  4. Python »JSON» JavaScript - snake_case aura du sens; vissez le frontal de toute façon
  5. Python »JSON» vous ne savez pas - snake_case aura du sens; vissez l'analyseur de toute façon
  6. PHP »JSON» Python - snake_case - unanime
  7. PHP »JSON» PHP - snake_case - unanime
  8. PHP »JSON» Java - snake_case - veuillez voir le problème Java ci-dessous
  9. PHP »JSON» JavaScript - snake_case aura du sens; vissez le frontal de toute façon
  10. PHP »JSON» vous ne savez pas - snake_case aura du sens; vissez l'analyseur de toute façon
  11. Java »JSON» Python - snake_case - veuillez voir le problème Java ci-dessous
  12. Java »JSON» PHP - snake_case - veuillez voir le problème Java ci-dessous
  13. Java »JSON» Java - camelCase - unanime
  14. Java »JSON» JavaScript - camelCase - unanime
  15. Java »JSON» que vous ne connaissez pas - camelCase aura du sens; vissez l'analyseur de toute façon
  16. JavaScript »JSON» Python - snake_case aura du sens; vissez le frontal de toute façon
  17. JavaScript »JSON» PHP - snake_case aura du sens; vissez le frontal de toute façon
  18. JavaScript »JSON» Java - camelCase - unanime
  19. JavaScript »JSON» JavaScript - camelCase - Original

Problème Java

snake_case aura toujours du sens pour ceux qui ont des entrées Java car les bibliothèques JSON existantes pour Java utilisent uniquement des méthodes pour accéder aux clés au lieu d'utiliser la dot.syntax standard . Cela signifie que cela ne ferait pas de mal à Java d'accéder aux clés snake_cased par rapport à l'autre langage de programmation qui peut faire la dot.syntax .

Exemple pour le package Javaorg.json

JsonObject.getString("snake_cased_key")

Exemple pour le package Javacom.google.gson

JsonElement.getAsString("snake_cased_key")

Quelques implémentations réelles

Conclusions

Le choix de la bonne convention de dénomination JSON pour votre implémentation JSON dépend de votre pile technologique. Il existe des cas où l'on peut utiliser snake_case , camelCase ou toute autre convention de dénomination.

Une autre chose à considérer est le poids à mettre sur le générateur JSON par rapport à l'analyseur JSON et / ou le JavaScript frontal. En général, plus de poids devrait être mis du côté du générateur JSON plutôt que du côté de l'analyseur JSON. En effet, la logique métier réside généralement du côté du générateur JSON.

De plus, si le côté analyseur JSON est inconnu, vous pouvez déclarer ce qui peut fonctionner pour vous.


2
"Person":n'est pas camelCase :)
stoft

1
@stoft, c'est probablement parce qu'ils ont également suivi la convention de schema.org. Commencer la clé avec une majuscule signifie qu'il s'agit d'une entité de vocabulaire. Démarrer la clé avec une lettre minuscule signifie qu'il s'agit d'une propriété de vocabulaire.
Abel Callejo

2
Je ne suis pas d'accord avec ces idées, simplement parce que le backend Python> le frontend Java devrait être camelCase, mais ensuite vous ajoutez le frontend Python et vous avez compromis le backend et un frontend. Cela devrait être la façon dont le backend l'a par "standard". Les analyseurs frontaux ont de toute façon plus de facilité à s'adapter
Bojan Kogoj

2
Ce qui m'inquiète ici, c'est qu'il est fait référence à la pile «votre technologie». Un producteur de JSON, surtout s'il doit être servi par un serveur HTTP, ne devrait pas savoir qui ou quoi le consomme, ni pour quelles raisons. Si JSON est utilisé comme méthode de communication entre de nombreux producteurs et consommateurs, la pile technologique du producteur ne devrait pas être prise en considération.
Robbie Wareham

1
@RobbieWareham Je suis en quelque sorte d'accord là-dessus. Le problème ici est que "selon les normes", il n'y a pas de convention de dénomination officielle. Donc, avec cela, on devrait peut-être opter pour "de facto" qui est de regarder la pile technologique. Je pense que regarder dans la pile technologique est la meilleure façon de procéder. Jetez un oeil à Facebook, ont-ils historiquement honoré JavaScript et utilisé snakeCase? Nah! Ils ont choisi de s'en tenir à snake_case de PHP.
Abel Callejo

18

Notamment pour moi sur NodeJS, si je travaille avec des bases de données et que mes noms de champs sont séparés par des traits de soulignement, je les utilise également dans les clés de structure.

C'est parce que les champs db ont beaucoup d'acronymes / abréviations, donc quelque chose comme appSNSInterfaceRRTest semble un peu désordonné mais app_sns_interface_rr_test est plus agréable.

En Javascript, les variables sont toutes camelCase et les noms de classe (constructeurs) sont ProperCase, donc vous verrez quelque chose comme

var devTask = {
        task_id: 120,
        store_id: 2118,
        task_name: 'generalLedger'
    };

ou

generalLedgerTask = new GeneralLedgerTask( devTask );

Et bien sûr, dans JSON, les clés / chaînes sont entourées de guillemets doubles, mais ensuite vous utilisez simplement JSON.stringify et passez dans les objets JS, donc ne vous inquiétez pas.

J'ai un peu lutté avec cela jusqu'à ce que je trouve ce juste milieu entre les conventions de nommage JSON et JS.


1
pareil ici. La réception de JSON avec snake_case au client Android semble maladroite !! De plus, la base de données ne différencie pas la casse pour les noms de colonne, donc snake_case semble être le meilleur pour la base de données.
mythicalcoder

@mythicalcoder JSON en Java n'est pas intrinsèque dans son cœur. Java utilise uniquement les paquets externes pour l' analyse syntaxique Java par exemple org.json, gson. La réception des données de snake_case ne fait pas si mal que ça ...JSONObject.get('snake_case_key_here')
Abel Callejo

9

Il semble qu'il y ait suffisamment de variations pour que les gens se mettent en quatre pour permettre la conversion de toutes les conventions vers d'autres: http://www.cowtowncoder.com/blog/archives/cat_json.html

Notamment, l'analyseur Jackson JSON mentionné préfère bean_naming.


5
Correction mineure: Jackson utilise par défaut la convention de dénomination du bean Java, qui est (inférieure) Camel Case, comme beanNaming.
StaxMan


0

Comme d'autres l'ont dit, il n'y a pas de norme, vous devez donc en choisir une vous-même. Voici quelques éléments à considérer lors de cette opération:

  1. Si vous utilisez JavaScript pour consommer JSON, l'utilisation de la même convention de dénomination pour les propriétés des deux fournira une cohérence visuelle et éventuellement des opportunités de réutilisation du code plus propre.

  2. Une petite raison pour éviter la casse kebab est que les tirets peuvent se heurter visuellement avec les -caractères qui apparaissent dans les valeurs.

    {
      "bank-balance": -10
    }

1
snake_case utilise des traits de soulignement, pas des tirets.
percebus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.