无法在JSON对象中放置空值

Ais*_*rya 13 java android json

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


      ...  }    
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 38

就在文档的第一段中:

值可能不是null,NaNs,无穷大,或此处未列出的任何类型.

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

不过,这是该课程的"特色"; JSON本身理解null得很好.在文档中进一步说明你使用"sentinal value" NULL来表示null.这似乎......很奇怪.有一个关于它的说明:

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

所以:

params.put(KEY_TOKEN, token == null ? JSONObject.NULL : token);
Run Code Online (Sandbox Code Playgroud)

  • @aish:与`JSONObject` 的设计者交谈。他们是决定让它以这种方式行事的人。好消息是*有*一种方法可以在那里获取`null`,你只需要以非标准的方式来做。坦率地说,这似乎很愚蠢,但我不知道他们工作的所有设计限制。 (2认同)
  • @BhalchandraSW:应该是“删除”操作,而不是“投入”操作。不以正常,毫不奇怪的方式处理`null'只是怪异的。:-) (2认同)
  • 并且 jsonObject.optString(key) 返回字符串“null”而不是实际的 null。我见过的最糟糕的 json 实现。 (2认同)

Ste*_*n C 5

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

不足之处在于JSON null表示Javascript null值。相比之下,null(根据专家的)Java版本与Javascript的undefined价值更加一致。

org.json库的原始作者决定JSONObject应该null以与Javascript语义一致的方式来处理JSON 。因此,它用Java表示(在Java中)JSONObject.NULL