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
值或根本没有值。
我理解如下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
值或根本没有值。