如何在Java中使用org.json.JSONObject将值设置为null?

80
如何使用java中的org.json.JSONObject将值设置为null? 我可以使用isNull读取null值,但当我放置null时,它似乎会忽略我:
JSONObject o = new JSONObject();
o.put("key",null);
o.isNull("key"); // returns true, buuuut...
o.has("key");    // returns false
o.isNull("somethingIHaventSetAtAll");    // also returns true, unfortunately

10
如果你将null作为参数传入,那么它会删除对应的键:http://www.json.org/javadoc/org/json/JSONObject.html#put(java.lang.String,%20java.lang.Object)。 - Martin Wilson
4个回答

176

尝试使用JSONObject.NULL代替null:

用于明确定义一个没有值的名称的标记值。与null不同,具有此值的名称:

  • 出现在names()数组中
  • 出现在keys()迭代器中
  • 对has(String)返回true
  • 调用get(String)时不会抛出异常
  • 包含在编码后的JSON字符串中。

此值违反了equals(Object)的一般合同,因为与null进行比较时返回true。它的toString()方法返回“null”。


你能提供一个例子来说明为什么它会违反合同吗? - voipp
它违反了规则(来自Object.equals):“对于任何非null引用值x,x.equals(null)应返回false”。 - Andres F.
@rekire 如何在org.json.simple.*中使用这个? - Kasun Siyambalapitiya
感谢您的回答! - Raj

0

对于我来说,使用net.sf.json.JSONObject,我需要通过以下方式创建一个空的JSON

new JSONObject(true)

这是我如何将类引入Groovy:

groovy.grape.Grape.grab(group: "org.kohsuke.stapler", module: "json-lib", version: "2.4-jenkins-2")

0

我创建了这个项目https://github.com/leonardofel/JSON-java-put-null-fix

要更改(或修复),只需将库导入您的pom.xml

这是您的代码的行为:

JSONObject o = new JSONObject();
o.put("key", null);
o.isNull("key"); // returns true
o.has("key"); // returns true
o.isNull("somethingIHaventSetAtAll"); // returns true
o.get("key"); // returns null

o.remove("key");
o.isNull("key"); // returns true
o.has("key"); // returns false
o.isNull("somethingIHaventSetAtAll"); // returns true
o.get("key"); // throws JSONException "key" not found

0

创建一个实用类,或者如果您已经有一个现有的实用类,只需在其中创建此实用方法。

 class JsonObjectUtility{
           public static Object getJSONObjectValue(Object value)  {
              return value == null ? "null" : value;
           }
 }

然后在将所有输入传递给JSONObject的put方法之前,先通过这个实用程序进行处理,如下所示:(我将使用问题中的代码示例)
JSONObject o = new JSONObject();
o.put("key", JsonObjectUtility.getJSONObjectValue(null) );

这将打印以下 JSON 字符串:

{ "key" : null }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接