Unable to put null values in JSON object
According to RFC 4627, JSON treats the null
symbol as a valid value.
The catch is that JSON null
is the representation for the Javascript null
value. By contrast, the Java version of null
is (according to the experts) more closely aligned with Javascript's undefined
value.
The original author of the org.json
library decided that JSONObject
should treat JSON null
in a way that is consistent with the Javascript semantics. Hence it is represented (in Java) as JSONObject.NULL
... which is not equal to null
.
Right there in the documentation, in the first paragraph:
Values may not be
null
,NaN
s, infinities, or of any type not listed here.
So yes, it is "...something that null
values are not included..." (edit: that was a quote from your original question; your updated question changes it to "uninitialized values" but the default value of an object reference is null
, so...)
It's a "feature" of that class, though; JSON itself understands null
just fine. Further down in the documentation it says you use a "sentinal value," NULL
, to represent null
. Which seems...odd. There's a note about it:
Warning: this class represents
null
in two incompatible ways: the standard Javanull
reference, and the sentinel valueNULL
. In particular, callingput(name, null)
removes the named entry from the object butput(name, JSONObject.NULL)
stores an entry whose value isJSONObject.NULL
.
So:
params.put(KEY_TOKEN, token == null ? JSONObject.NULL : token);
I solved this by creating a class that extends JSONObject
and overriding the method put
to use JSONObject.NULL
when the passed object is null
public class ObjectJSON extends JSONObject {
public JSONObject put(String key, Object value) throws JSONException {
return super.put(key, value == null ? JSONObject.NULL : value);
}
}