Quelle est la méthode préférée pour renvoyer des valeurs nulles en JSON? Existe-t-il une préférence différente pour les primitives?
Par exemple, si mon objet sur le serveur a un entier appelé "myCount" sans valeur, le JSON le plus correct pour cette valeur serait:
{}
ou
{
"myCount": null
}
ou
{
"myCount": 0
}
Même question pour Strings - si j'ai une chaîne nulle "myString" sur le serveur, c'est le meilleur JSON:
{}
ou
{
"myString": null
}
ou
{
"myString": ""
}
ou (seigneur m'aide)
{
"myString": "null"
}
J'aime la convention pour que les collections soient représentées dans le JSON comme une collection vide http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Un tableau vide serait représenté:
{
"myArray": []
}
Modifier le résumé
L'argument de la «préférence personnelle» semble réaliste, mais à courte vue dans la mesure où, en tant que communauté, nous consommerons un nombre toujours plus grand de services / sources disparates. Des conventions pour la structure JSON aideraient à normaliser la consommation et la réutilisation desdits services. En ce qui concerne l'établissement d'une norme, je suggérerais d'adopter la plupart des conventions de Jackson à quelques exceptions près:
- Les objets sont préférés aux primitives.
- Les collections vides sont préférées à null.
- Les objets sans valeur sont représentés comme nuls.
- Les primitifs renvoient leur valeur.
Si vous renvoyez un objet JSON avec des valeurs généralement nulles, vous pouvez avoir un candidat pour la refactorisation dans plusieurs services.
{
"value1": null,
"value2": null,
"text1": null,
"text2": "hello",
"intValue": 0, //use primitive only if you are absolutely sure the answer is 0
"myList": [],
"myEmptyList": null, //NOT BEST PRACTICE - return [] instead
"boolean1": null, //use primitive only if you are absolutely sure the answer is true/false
"littleboolean": false
}
Le JSON ci-dessus a été généré à partir de la classe Java suivante.
package jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonApp {
public static class Data {
public Integer value1;
public Integer value2;
public String text1;
public String text2 = "hello";
public int intValue;
public List<Object> myList = new ArrayList<Object>();
public List<Object> myEmptyList;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Data()));
}
}
Dépendance Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
null
, considérez si votre client préfère la chaîne vide ounull
- une chaîne contenant le mot "null" ne peut pas être distinguée d'une valeur valide, ne faites pas cela.NSNull
classe définie qui a une instance singleton. Une référence à cette instance est équivalente à JSONnull
. Je suppose qu'une autre langue pourrait faire la même chose. Bien sûr, il faudrait vérifier la classe de l'objet reçu avant de lancer dans la classe présumée - être "nul au courant", pour ainsi dire.Collections.emptyList()
). Cela évite les bogues de référence nuls qui peuvent être gênants autrement.Null
classe (utile) car vous ne pouviez affecter ses valeurs qu'à des objets de son propre type ou de typeObject
.Réponses:
Évaluons l'analyse de chacun:
http://jsfiddle.net/brandonscript/Y2dGv/
JSON1
{}
Cela renvoie un objet vide. Il n'y a pas de données là-bas, et cela va seulement vous dire que quelle que soit la clé que vous recherchez (que ce
myCount
soit ou autre) est de typeundefined
.JSON2
{"myCount": null}
Dans ce cas,
myCount
est en fait défini, bien que sa valeur soitnull
. Ce n'est pas la même chose que «nonundefined
et nonnull
», et si vous testiez une condition ou l'autre, cela pourrait réussir alors que JSON1 échouerait.C'est la façon définitive de représenter
null
selon la spécification JSON .JSON3
{"myCount": 0}
Dans ce cas, myCount est 0. Ce n'est pas la même chose que
null
, et ce n'est pas la même chose quefalse
. Si votre déclaration conditionnelle est évaluéemyCount > 0
, cela peut valoir la peine. De plus, si vous exécutez des calculs basés sur la valeur ici, 0 pourrait être utile.null
Cependant, si vous essayez de tester , cela ne fonctionnera pas du tout.JSON4
{"myString": ""}
Dans ce cas, vous obtenez une chaîne vide. Encore une fois, comme avec JSON2, il est défini, mais il est vide. Vous pouvez tester
if (obj.myString == "")
mais vous ne pouvez pas testernull
ouundefined
.JSON5
{"myString": "null"}
Cela va probablement vous poser des problèmes, car vous définissez la valeur de chaîne sur null; dans ce cas,
obj.myString == "null"
ce n'est pas le cas== null
.JSON6
{"myArray": []}
Cela vous dira que votre tableau
myArray
existe, mais il est vide. Ceci est utile si vous essayez d'effectuer un comptage ou une évaluation surmyArray
. Par exemple, supposons que vous vouliez évaluer le nombre de photos postées par un utilisateur - vous pourriez le fairemyArray.length
et cela reviendrait0
: défini, mais aucune photo publiée.la source
JSON1
ie{}
null
n'est pas nul. Ce n'est pas une valeur en soi : c'est une valeur en dehors du domaine de la variable indiquant des données manquantes ou inconnues.Il n'y a qu'une seule façon de représenter
null
en JSON. Selon les spécifications ( RFC 4627 et json.org ):la source
json = '{"myValue":}';
Il n'y a qu'une seule façon de représenter
null
; c'est avecnull
.C'est-à-dire; si l'un des clients qui consomment votre représentation JSON utilise l'
===
opérateur; cela pourrait être un problème pour eux.aucune valeur
Si vous souhaitez transmettre que vous avez un objet dont l'attribut
myCount
n'a pas de valeur:aucun attribut / attribut manquant
Que faire si vous indiquez que vous avez un objet sans attribut:
Le code client essaiera d'accéder
myCount
et d'obtenirundefined
; Ce n'est pas là.collection vide
Que faire si vous indiquez que vous avez un objet avec un attribut
myCount
qui est une liste vide:la source
Je voudrais utiliser
null
pour montrer qu'il n'y a aucune valeur pour cette clé particulière. Par exemple, utiliseznull
pour représenter que «le nombre d'appareils de votre foyer se connecte à Internet» est inconnu.D'un autre côté, utilisez
{}
si cette clé particulière n'est pas applicable. Par exemple, vous ne devez pas afficher de décompte, même sinull
, à la question «le nombre de voitures disposant d'une connexion Internet active» est demandé à une personne qui ne possède pas de voiture.J'éviterais de mettre par défaut une valeur à moins que cette valeur par défaut ait du sens. Bien que vous puissiez décider de l'utiliser
null
pour ne représenter aucune valeur, ne l'utilisez certainement jamais"null"
.la source
Je choisirais "par défaut" pour le type de données de la variable (
null
pour les chaînes / objets,0
pour les nombres), mais vérifie en effet quel code qui consommera l'objet attend. N'oubliez pas qu'il y a parfois une distinction entrenull
/ default et "not present".Consultez le modèle d'objet nul - il est parfois préférable de passer un objet spécial au lieu de
null
(c'est-à-dire un[]
tableau plutôt quenull
pour des tableaux ou""
des chaînes).la source
Il s'agit d'un choix personnel et situationnel. La chose importante à retenir est que la chaîne vide et le nombre zéro sont conceptuellement distincts de
null
.Dans le cas d'un,
count
vous voulez probablement toujours un certain nombre valide (sauf si lecount
est inconnu ou indéfini), mais dans le cas des chaînes, qui sait? La chaîne vide peut signifier quelque chose dans votre application. Ou peut-être que non. C'est à vous de décider.la source
Selon la spécification JSON , le conteneur le plus à l'extérieur ne doit pas nécessairement être un dictionnaire (ou un «objet») comme le laisse entendre la plupart des commentaires ci-dessus. Il peut également s'agir d'une liste ou d'une valeur nue (c'est-à-dire chaîne, nombre, booléen ou null). Si vous souhaitez représenter une valeur nulle en JSON, la chaîne JSON entière (à l'exclusion des guillemets contenant la chaîne JSON) est simplement
null
. Pas d'accolades, pas de crochets, pas de guillemets. Vous pouvez spécifier un dictionnaire contenant une clé avec une valeur nulle ({"key1":null}
) ou une liste avec une valeur nulle ([null]
), mais ce ne sont pas des valeurs nulles elles-mêmes - ce sont des dictionnaires et des listes appropriés. De même, un dictionnaire vide ({}
) ou une liste vide ([]
) sont parfaitement bien, mais ne sont pas non plus nuls.En Python:
la source
null
constitue un JSON valide. Le corps du texte et les illustrations sont ambigus et, si quelque chose semble suggérer, seuls les objets et les tableaux sont valides à la racine.