【问题标题】:Unable to put null values in JSON object无法将空值放入 JSON 对象
【发布时间】:2017-06-19 13:13:56
【问题描述】:

我正在尝试使用 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 作为它的实例变量。那么是不是没有包含未初始化的值呢?

【问题讨论】:

  • 你可以检查,不是吗?令牌=null
  • 只需要询问未初始化的值
  • @aish:由于token的类型是String,并且是一个实例成员,所以它的默认值是null,所以是一样的。

标签: java android json


【解决方案1】:

就在the documentation,第一段:

值不得为nullNaNs、无穷大或此处未列出的任何类型。

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

不过,这是该课程的“特色”; JSON 本身理解 null 就好了。在文档的下方,它说您使用“原始值”NULL 来表示null。这看起来……很奇怪。有一个注释:

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

所以:

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

【讨论】:

  • 但该字符串对象的值为 null 所以它应该理解它。如果不是必须抛出错误
  • @aish:与JSONObject 的设计师交谈。他们是决定让它以这种方式运行的人。好消息是一种方法可以在其中获取null,您只需要以非标准方式进行即可。坦率地说,这似乎很愚蠢,但我不知道他们所面临的所有设计限制。
  • 从 JSON 中删除任何值为 null 的内容,因为它被理解为未设置,因此不需要。因此,它从 JSON 字符串中删除,以减少网络传输期间的负载
  • @BhalchandraSW:那应该是remove 操作,而不是put 操作。不以正常、不出所料的方式处理null 只是很奇怪。 :-)
  • 而且 jsonObject.optString(key) 返回字符串“null”而不是实际的 null。我见过的最糟糕的 json 实现。
【解决方案2】:

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

关键是 JSON null 是 Javascript null 值的表示形式。相比之下,null 的 Java 版本(根据专家的说法)更接近 Javascript 的 undefined 值。

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

【讨论】:

    【解决方案3】:

    我通过使用字符串表示创建空 JSON 值将空值填充到对象中解决了这个问题。显然是一个 hack,但它确实有效。

    JSONObject obj = new JSONObject("{\"keyword\": null}");
    System.out.println(obj); // {"keyword": null}
    

    【讨论】:

      【解决方案4】:

      我通过创建一个扩展 JSONObject 的类并覆盖方法 put 以在传递的对象为 null 时使用 JSONObject.NULL 解决了这个问题

      public class ObjectJSON extends JSONObject {
          public JSONObject put(String key, Object value) throws JSONException {
              return super.put(key, value == null ? JSONObject.NULL : value);
          }
      }
      

      【讨论】:

      • 无法按原样使用该解决方案,因为我无法从 net.sf.json.JSONObject 扩展 JSONObject 类,因为该类是最终的。我所做的是创建一个实用方法,即 public static Object getJSONObjectValue(Object value) { return value == null ? “空”:值;然后每当我像这样调用 JSONObject 类的 put 方法时调用这个方法... jsonObject.put("key", Utility.getJSONObjectValue(objectValue));
      【解决方案5】:

      Json 本身接受 null 但 JSONOBJECT 类不接受。因此,您无法做到这一点。也尝试使用 jackson/gson 来代替 json 和对象映射。如果您需要帮助,请告诉我。

      【讨论】:

        【解决方案6】:

        我修复了这个“功能”并创建了这个项目https://github.com/leonardofel/JSON-java-put-null-fix

        使下面的代码成为可能:

        JSONObject j = new JSONObject().put("myPreciousNull", null);
        System.out.println(j.toString());
        

        打印:

        {"myPreciousNull":null}
        

        【讨论】:

          猜你喜欢
          • 2016-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多