无法在 JSON 对象中放置空值

2022-09-01 02:15:54

我正在尝试使用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+"");


      ...  }    

我得到了参数的价值,但令牌无处可见。我还没有初始化令牌,其值为空,因为它是一个实例变量。那么,它是否包含未初始化的值?{"date":"2017-06-19"}


答案 1

就在文档的第一段中:

值不能是 、s、无穷大或此处未列出的任何类型。nullNaN

所以,是的,它是“...不包括值的东西......“(编辑:这是你原始问题的引用;你更新的问题将其更改为”未初始化的值“,但对象引用的默认值为,所以...)

不过,这是该类的“功能”;JSON本身理解得很好。在文档的后面,它说你使用一个“sentinal值”NULL来表示。这似乎...奇怪。有一个关于它的注释:nullnull

警告:此类以两种不兼容的方式表示:标准 Java 引用和 sentinel 值 。特别是,调用会从对象中删除命名条目,但会存储值为 的条目。nullnullNULLput(name, null)put(name, JSONObject.NULL)JSONObject.NULL

所以:

params.put(KEY_TOKEN, token == null ? JSONObject.NULL : token);

答案 2

根据 RFC 4627,JSON 将符号视为有效值。null

问题是JSON是Javascript值的表示形式。相比之下,Java版本(根据专家的说法)与Javascript的价值更紧密地一致。nullnullnullundefined

该库的原始作者决定应该以与Javascript语义一致的方式处理JSON。因此,它(在Java中)表示为...不等于 。org.jsonJSONObjectnullJSONObject.NULLnull