我正在尝试使用JSON将参数传递给api。
class Sample
{ ...
String token;
...
void method()
{ ...
JSONObject params = new JSONObject();
params.put(KEY_TOKEN,token);
params.put(KEY_DATE,date);
Log.e("params ",params+"");
... }
我将params的值设为{"date":"2017-06-19"}
,但令牌无处可见。
我没有初始化令牌,它的值为null,因为它是一个实例变量。那么未包含未初始化的价值是什么?
答案 0 :(得分:27)
在the documentation中,在第一段中:
值可能不是
null
,NaN
s,无穷大或此处未列出的任何类型。
是的,它是“... null
值不包括在内的东西......” (编辑:这是你原来问题的引用;你的更新的问题将其更改为“未初始化的值”,但对象引用的默认值为null
,因此......)
这是该课程的“特色”; JSON本身理解null
就好了。在文档中进一步说明,您使用“sentinal value”NULL
来表示null
。这似乎......很奇怪。有一个关于它的说明:
警告:此类以两种不兼容的方式表示
null
:标准Javanull
引用和标记值NULL
。特别是,调用put(name, null)
会从对象中删除命名条目,但put(name, JSONObject.NULL)
会存储值为JSONObject.NULL
的条目。
所以:
params.put(KEY_TOKEN, token == null ? JSONObject.NULL : token);
答案 1 :(得分:4)
根据RFC 4627,JSON会将null
符号视为有效值。
问题是JSON null
代表Javascript null
值。相比之下,null
的Java版本(根据专家)更接近于Javascript的undefined
值。
org.json
库的原作者决定JSONObject
应该以与Javascript语义一致的方式处理JSON null
。因此,它(在Java中)表示为JSONObject.NULL
。
答案 2 :(得分:2)
我通过使用字符串表示形式创建null JSON值以将null值填充到对象中来解决了此问题。显然是hack,但是可以。
JSONObject obj = new JSONObject("{\"keyword\": null}");
System.out.println(obj); // {"keyword": null}
答案 3 :(得分:1)
Json本身接受null但JSONOBJECT类没有。因此,你无法做到这一点。另外尝试使用jackson / gson进行json和对象映射。如果您需要帮助,请告诉我。
答案 4 :(得分:1)
我修复了这个“功能”并创建了这个项目 https://github.com/leonardofel/JSON-java-put-null-fix
使下面的代码成为可能:
JSONObject j = new JSONObject().put("myPreciousNull", null);
System.out.println(j.toString());
印刷品:
{"myPreciousNull":null}
答案 5 :(得分:0)
我通过创建一个扩展 JSONObject
的类并覆盖方法 put
以在传递的对象为 JSONObject.NULL
时使用 null
来解决此问题
public class ObjectJSON extends JSONObject {
public JSONObject put(String key, Object value) throws JSONException {
return super.put(key, value == null ? JSONObject.NULL : value);
}
}