>我在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