java pojo中如何区分JSON null值和默认java null

How to distinguish between JSON null value and default java null in java pojo

我理解如下JSON

 {    "id": "1",    "value": "some value"   }

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

{    "id": "3"   }

要保存上述 JSON 数据,我有 java class :

    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 中传递的空值和其他未传递的字段,因此 java pojo 的默认值为 NULL。

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

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

我能想到的唯一可能的解决方案:跟踪对 setter 的调用并确保您使用的 jSON 库设置了明确的空值。

会给出以下结果:

  • id 1: setter 用 "some value"
  • 调用
  • id 2: setter 调用为 null
  • id 3: setter 调用

托本斯评论后的替代方案: 如果库不使用 getters/setters,您可以使用 "unset" 的特殊值,并将 getter 中的值屏蔽为 return null。

使用此代码:

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

为此 { "id": "2", "value": 空} 它将 return null 作为 JAVA Sting

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

为此 { "id": “3” } 它将 return 空值

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

最好不要区分 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 值或根本没有值。