web-dev-qa-db-fra.com

Impossible de mettre des valeurs NULL dans un objet JSON

J'essaye de passer le paramètre à api en utilisant JSON.

class Sample
{ ...
   String token;
...

void method()
{ ...
    JSONObject params = new JSONObject();
    params.put(KEY_TOKEN,token);
    params.put(KEY_DATE,date);

    Log.e("params ",params+"");


      ...  }    

J'obtiens la valeur de params sous la forme {"date":"2017-06-19"} mais le jeton n'est visible nulle part . Je n'ai pas initialisé le jeton et sa valeur est null en tant que variable d'instance. Alors, est-ce que c'est quelque chose que les valeurs non initialisées ne sont pas incluses?

5
Aishwarya

Juste là dans la documentation , dans le premier paragraphe:

Les valeurs peuvent ne pas être null, NaNs, infinity ou de tout type non répertorié ici.

Alors oui, c’est "... quelque chose dont les valeurs null ne sont pas incluses ..."(edit: c’était une citation de votre question initiale; votre question mise à jour la change en "valeurs non initialisées "mais la valeur par défaut d’une référence d’objet est null, donc ...)

C'est une "caractéristique" de cette classe, cependant; JSON lui-même comprend null très bien. Plus bas dans la documentation, vous indiquez que vous utilisez une "valeur sentinale" NULL , pour représenter null. Ce qui semble ... étrange. Il y a une note à ce sujet:

Warning: cette classe représente null de deux manières incompatibles: la référence Java null standard et la valeur sentinelle NULL. En particulier, l'appel de put(name, null) supprime l'entrée nommée de l'objet, mais put(name, JSONObject.NULL) enregistre une entrée dont la valeur est JSONObject.NULL.

Alors:

params.put(KEY_TOKEN, token == null ? JSONObject.NULL : token);
20
T.J. Crowder

Selon RFC 4627 , JSON considère le symbole null comme une valeur valide.

Le problème est que JSON null représente la valeur Javascript null. En revanche, la version Java de null est (selon les experts) plus alignée sur la valeur undefined de Javascript.

L'auteur original de la bibliothèque org.json a décidé que JSONObject devrait traiter JSON null d'une manière compatible avec la sémantique Javascript. Par conséquent, il est représenté (en Java) par JSONObject.NULL.

4
Stephen C

Json lui-même accuse null mais la classe JSONOBJECT ne le fait pas. Par conséquent, vous ne pouvez pas le faire. Essayez également d’utiliser Jackson/gson pour json et le mappage d’objets. Si vous avez besoin d'aide, faites le moi savoir. 

1
Priya Jain