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>
NSNull
classe définie qui a une instance singleton. Une référence à cette instance est équivalente à JSON null
. 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 type Object
.
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.