如何在Java Pojo中区分JSON的null值和默认的Java null值

6

我了解下面的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的值不应该相同。
是否有可能区分提供的JSON NULL和Java中的默认NULL?

3
你需要明确你在使用哪个JSON库来解析JSON。在解析后很可能无法实现。问题是:为什么你想要这样做?如果你真的需要这样做,最好改变你的方法。 - Erwin Bolwidt
4
你可以将其反序列化为 Map 以确保。 - ernest_k
为什么你需要区分这些情况?就我个人而言,通常我会配置我的JSON序列化,以便不写入空值。null就是null。无论它是默认的还是明确设置为null都没有关系。 - Mark Rotteveel
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值或根本不写入任何值。


1
通过在isSetValue上添加@JsonIgnore,我可以忽略序列化/反序列化。 - sudheer mishra

0
请使用以下代码:
JSONObject jsonObject = new JSONObject(response);
Sting s =  jsonObject.optString("value");

针对此代码 { "id": "2", "value": null } 它将返回JAVA String中的null值。
jsonObject.optString("value"); // s="null"

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

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

0
我能想到的唯一可能的解决方案是:跟踪对setter的调用,并确保您使用的jSON库设置显式的null值。
将会给出以下结果:
  • id 1: 使用“some value”调用了setter
  • id 2: 使用null调用了setter
  • id 3: 没有调用setter
在Torbens的评论之后,可以尝试使用一个特殊的“未设置”值并在getter中掩盖该值,以返回null。如果库不使用getter / setter。

2
如果JSON库直接使用反射设置字段(像其中一些库那样),则无法正常工作。 - Torben
@Torben,你当然是正确的。也许有配置选项可以让它们使用getter/setter。 - jokster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接