无法在JSON对象中放置空值

时间:2017-06-19 13:13:57

标签: 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+"");


      ...  }    

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

6 个答案:

答案 0 :(得分:27)

the documentation中,在第一段中:

  

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

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

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

  

警告:此类以两种不兼容的方式表示null:标准Java null引用和标记值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);
    }
}