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

How do you set a value to null with org.json.JSONObject in java?

提问人:B T 提问时间:11/29/2012 更新时间:8/5/2023 访问量:75480

问:

如何在 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
Java JSON

评论

10赞 Martin Wilson 11/29/2012
如果你把 null 放进去,那么它会删除键:json.org/javadoc/org/json/...

答:

176赞 rekire 11/29/2012 #1

尝试设置 JSONObject.NULL 而不是:null

一个哨兵值,用于显式定义没有值的名称。与 null 不同,具有此值的名称:

  • 显示在 names() 数组中
  • 显示在 keys() 迭代器中
  • 返回 true for has(String)
  • 不要抛出 get(String)
  • 包含在编码的 JSON 字符串中。

与 null 相比,此值返回 true,从而违反了 equals(Object) 的一般约定。它的 toString() 方法返回 “null”。

评论

0赞 voipp 10/20/2016
您能否举例说明为什么会违反合同?
0赞 Andres F. 11/17/2016
@voipp 它违反了规则 (from) :“对于任何非 null 引用值 x,x.equals(null) 应返回 false”。Object.equals
0赞 Kasun Siyambalapitiya 1/20/2017
@rekire如何在org.json.simple.*
0赞 Raj 8/28/2017
感谢您的回答!
0赞 akostadinov 6/22/2018 #2

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

new JSONObject(true)

这就是我如何让类进入时髦:

groovy.grape.Grape.grab(group: "org.kohsuke.stapler", module: "json-lib", version: "2.4-jenkins-2")
0赞 Leonardo Lopes 1/22/2021 #3

我创建了这个项目 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赞 Winter MC 2/13/2022 #4

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

 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 字符串,如下所示

{ “键” : null }