96 votes

Le JSON doit-il inclure des valeurs nulles ?

Je suis en train de créer une API qui renvoie les résultats en JSON. Existe-t-il une meilleure pratique actuelle pour savoir si nous devons inclure les clés dans le résultat lorsque la valeur est nulle ? Par exemple :

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

ou

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

Comme le second est plus petit, je penche pour ce style, mais je ne suis pas sûr qu'il y ait un style préféré ou non. Du point de vue du client, il semble que les deux styles soient fonctionnellement équivalents. Quels sont les avantages et les inconvénients de chacun ?

8 votes

Il est impossible de répondre correctement à cette question. La réponse correcte dépend des exigences de l'application. Le PO a simplement choisi la réponse qui correspond à ses besoins. Si votre application doit être capable de faire la distinction entre savoir si le "isbn" est nul et savoir si le "isbn" peut ne pas avoir été envoyé par le serveur pour une autre raison, vous devez l'inclure.

0 votes

@Jacob Bien que je ne l'aie pas dit, mon intention avec cette question était que le JSON "complet" représentant la réponse soit renvoyé. Quand un client peut supposer qu'il n'y a pas de différence fonctionnelle entre les deux approches. Si l'API ne renvoyait pas les clés/valeurs de manière sélective, alors oui, il y aurait une grande différence entre les deux approches.

0 votes

L'avantage de la première représentation est que le schéma de l'objet est préservé, la présence de la propriété n'est pas ambiguë en fonction des données. dans le second format, cette information est perdue. La spécification JSON en tant que telle n'impose aucun des deux formats.

85voto

rushkeldon Points 406

Je suis un adepte de l'inclusion explicite de null, car cela a un sens. Alors que l'omission d'une propriété laisse une ambiguïté.

Tant que votre protocole avec le serveur est accepté, tout ce qui précède peut fonctionner, mais si vous passez des nuls depuis le serveur, je pense que cela rend vos API plus flexibles par la suite.

Il faut également mentionner que la fonction hasOwnProperty de javascript vous donne un aperçu supplémentaire.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )

3 votes

Exactement, davantage de personnes doivent comprendre la différence entre "", null et undefined. La réponse à cette question dépend des besoins des utilisateurs.

15 votes

+1. La personne à l'autre bout (qui a écrit le code) sera mieux servie par des valeurs explicites. Elle n'écrit peut-être pas de JavaScript ;-)

2 votes

Notez que la vérification contre null ne fonctionne pas avec ==, === est nécessaire (car undefined == null) !

33voto

Niet the Dark Absol Points 154811

La deuxième solution permet d'économiser une petite quantité de bande passante, mais si cela était un problème, vous utiliseriez également des tableaux indexés au lieu de remplir le JSON avec des clés. C'est clair, ["Foo Bar","Joe Blow"] est beaucoup plus courte que celle que vous avez maintenant.

En termes de convivialité, je ne pense pas que cela fasse une différence. Dans les deux cas, if(json.isbn) passera au else . Il n'est généralement pas nécessaire de faire la distinction entre null (sans valeur) et undefined (aucune valeur donnée).

7 votes

+1 pour Il n'est généralement pas nécessaire de faire la distinction entre null (aucune valeur) et undefined (aucune valeur donnée). Il existe même un opérateur pratique pour cela != null (intention non stricte)

0 votes

Le seul cas auquel je puisse penser serait de tester si un navigateur supporte un certain type d'événement. Par exemple, if( typeof onbeforepaste == "undefined") pour voir si onBeforePaste est prise en charge. Même dans ce cas, cela ne fait aucune différence puisque vous pouvez attribuer des événements autant que vous le souhaitez (ils ne feront rien s'ils ne sont pas pris en charge).

0 votes

Dans ce cas, je testerais "onbeforepaste" in document pour vérifier l'existence de la propriété.

23voto

Brad Points 61171

En JavaScript, null signifie quelque chose de très différent de undefined .

Votre sortie JSON doit refléter ce qui est utilisé et nécessaire à votre application dans le contexte spécifique de l'utilisation des données JSON.

5 votes

Il n'y a pas de "undefined" dans JSON, donc je pense qu'il demande seulement s'il faut inclure ou non les propriétés "vides". {"prop":undefined} est différent de {} .

1 votes

Je suis d'accord, j'essaie d'expliquer qu'au niveau de la réception, s'il cherche à ce qu'une propriété spécifique soit définie comme nulle, elle ne le sera pas. Elle sera indéfinie, si elle est laissée de côté.

12voto

Paulpro Points 54844

Vous devez absolument l'inclure s'il est nécessaire de faire la distinction entre null y undefined car ils ont deux significations différentes en Javascript. Vous pouvez penser à null comme signifiant que le bien est inconnu ou sans signification, et undefined comme signifiant que la propriété n'existe pas.

D'un autre côté, si personne n'a besoin de faire cette distinction, alors allez-y et laissez-la de côté.

1voto

Alexey Kachalov Points 11

Lorsque JSON est utilisé comme support de données de l'API, il n'y a aucune différence entre une valeur nulle ou vide (non définie). Il est probable que la valeur vide soit meilleure car elle permet d'économiser de la taille de la charge utile.

La différence apparaît pour les fichiers JSON-config lorsque vous souhaitez modifier quelque chose à la main. Il est préférable d'avoir des nuls à la place des props indéfinis. De cette façon, vous donnerez des indices sur l'existence des props de configuration.

1 votes

Pourriez-vous élaborer davantage votre réponse en décrivant un peu plus la solution que vous proposez ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X