webentwicklung-frage-antwort-db.com.de

NULL-Werte können nicht in das JSON-Objekt eingefügt werden

Ich versuche, Parameter mit JSON an API zu übergeben.

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

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

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


      ...  }    

Ich bekomme den Wert von params als {"date":"2017-06-19"}, aber das Token wird nirgends gesehen . Ich habe das Token nicht initialisiert und sein Wert ist als Instanzvariable null. Ist es also etwas, das nicht initialisierte Werte nicht enthalten?

5
Aishwarya

Genau dort in der Dokumentation , im ersten Absatz:

Die Werte dürfen nicht null, NaNs, unendlich sein oder von einem beliebigen Typ sein, der hier nicht aufgeführt ist.

Ja, es ist "... etwas, das null-Werte nicht enthalten sind ..."(Bearbeiten: Das war ein Zitat aus Ihrer ursprünglichen Frage; Ihre aktualisierte Frage ändert sie in "nicht initialisierte Werte") "aber der Standardwert einer Objektreferenz ist null, also ...)

Es ist jedoch ein "Feature" dieser Klasse; JSON selbst versteht null gut. Weiter unten in der Dokumentation heißt es, Sie verwenden einen "Sentinal-Wert" NULL , um null darzustellen. Was scheint ... seltsam. Es gibt eine Notiz dazu:

Warning: Diese Klasse repräsentiert null auf zwei inkompatible Arten: die Standard-Java-null-Referenz und den Sentinel-Wert NULL. Der Aufruf von put(name, null) entfernt insbesondere den benannten Eintrag aus dem Objekt, speichert jedoch put(name, JSONObject.NULL) einen Eintrag, dessen Wert JSONObject.NULL lautet.

So:

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

Gemäß RFC 4627 behandelt JSON das null-Symbol als gültigen Wert.

Der Haken ist, dass JSON null den Javascript null-Wert darstellt. Im Gegensatz dazu ist die Java-Version von null (nach Meinung der Experten) enger mit dem undefined-Wert von Javascript ausgerichtet.

Der ursprüngliche Autor der org.json-Bibliothek entschied, dass JSONObject JSON null so behandeln sollte, dass es der Javascript-Semantik entspricht. Daher wird es (in Java) als JSONObject.NULL dargestellt.

4
Stephen C

Json selbst übernimmt null, die JSONOBJECT-Klasse dagegen nicht. Verwenden Sie stattdessen Jackson/Gson für Json- und Objekt-Mapping. Wenn Sie Hilfe brauchen, lassen Sie es mich wissen. 

1
Priya Jain