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



>我在JSON下面理解

 

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

  

{ "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 的值不应该相同。

是否可以区分java中提供的JSON NULL和默认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值还是根本不写入值。

我能想象到的唯一可能的解决方案:跟踪对 setter 的调用,并确保您使用的 jSON 库设置显式 null 值。

将给出以下结果:

  • ID 1:使用"某个值"调用的二传手
  • ID 2:以空值调用的二传手
  • id 3:调用二传手

托本斯评论后的替代方案: 如果库不使用 getter/setter,则可以使用"unset"的特殊值,并在 getter 中屏蔽该值以返回 null。

使用以下代码:

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

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

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

为此 { "id": "3" } 它将返回空值

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

最新更新