6

我在JSON下面理解

 

 {“id”:“1”,“值”:“某个值”}

  

{ "id": "2", "value": null }

  

{“id”:“3”}

 为了保存上面的 JSON 数据,我有 java 类:

    class myClass
    {
       private String id;
       private String value;
       public String getId() {
        return id;
       }
       public void setId(String id) {
        this.id = id;
       }
       public String getValue() {
        return value;
       }
       public void setValue(String value) {
        this.value = value;
      }
}

在上面的示例中: id 2 和 id 3 的值都为 NULL

在 java 中,很难区分 JSON 中传递的 null 值和其他未传递的字段,因此 java pojo 的默认值为 NULL。

对我来说 id 2 和 id 3 的值不应该相同。

是否可以区分提供的 JSON NULL & 和 java 中的默认 NULL?

4

3 回答 3

3

最好不要区分null缺失值,因为您必须提出这个问题:这种区分并不容易,并且可能不适用于所有 JSON 库,尤其是在自动转换为 POJO 时。

它是否有效取决于 JSON 库,但您可以尝试向 POJO 添加一个附加标志,该标志在调用 setter 时设置。例如像这样:

class MyClass {

    private String value;
    private boolean isSetValue;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
        isSetValue = true;
    }

    public boolean getIsSetValue() {
        return isSetValue;
    }
}

如果您打算序列化此 POJO,则需要getIsSetValue从序列化中排除,并且您可能需要修改 JSON 序列化程序以用于getIsSetValue决定是写入null值还是根本不写入值。

于 2018-08-24T08:03:26.817 回答
0

使用此代码:

JSONObject jsonObject = new JSONObject(response);
Sting s =  jsonObject.optString("value");

对于这个 { "id": "2", "value": null } 它将返回 null 作为 JAVA Sting

jsonObject.optString("value"); // s="null"

对于这个 { "id": "3" } 它将返回空值

jsonObject.optString("value"); // s==null
于 2018-08-24T07:53:56.433 回答
0

我能想象的唯一可能的解决方案:跟踪对设置器的调用并确保您使用的 JSON 库设置显式空值。

将给出以下结果:

  • id 1:用“一些值”调用的 setter
  • id 2:用 null 调用的 setter
  • id 3:未调用setter

Torbens 评论后的替代方案:如果库不使用 getter/setter,您可以使用“unset”的特殊值并在 getter 中屏蔽它以返回 null。

于 2018-08-24T05:59:44.420 回答