Java-NullPointerException在解析JSON时忽略getOrDefault

Java-NullPointerException在解析JSON时忽略getOrDefault,java,json,collections,Java,Json,Collections,我试图解析JSON,并决定使用getOrDefault处理空值。根据文档:返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue 然而,当它解析JSON-theDate中的以下行时:null我得到一个NullPointerException。调试时,我注意到字符串 尽管调用了getOrDefault,dateFromJson还是为null。但我希望它有一个默认的字符串值 我在这里的实施和理解可能有什么问题 public static Long parseDate(JSON

我试图解析JSON,并决定使用getOrDefault处理空值。根据文档:返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue

然而,当它解析JSON-theDate中的以下行时:null我得到一个NullPointerException。调试时,我注意到字符串 尽管调用了getOrDefault,dateFromJson还是为null。但我希望它有一个默认的字符串值

我在这里的实施和理解可能有什么问题

public static Long parseDate(JSONObject jsonObj, String date, String _default) throws ParseException {
    String dateFromJson = (String) jsonObj.getOrDefault(date, _default);
    if (Objects.equals(dateFromJson, _default)) {
        return System.currentTimeMillis();        
    }
    return DATE_FORMAT.parse(dateFromJson).getTime();
}

我认为您已经理解了返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue。以错误的方式。基本上,这意味着如果在输入模型中没有键=字符串日期的属性,那么将返回默认值。但是,如果您正在查找一个属性,但其值为null,则将返回此null。不是吗?

如果在json中显式地使用了date:null,那么JSONObject将包含条目{key=theDate,value=null},当您调用getOrDefault时,由于该键包含在本质上是专门映射的JSONObject中,因此不会使用默认值。因为您从最后一行得到了异常,所以很容易推断出_default不为null,否则Objects.equalsdateFromJson,_default将为true,如果条件返回该方法

你需要这样做

String result = Optional.ofNullable(jsonObj.get(date)).orElse(_default);
因为任何一个键都包含null值,或者没有键,所以在这两种情况下都会得到null。所以最好只是用可选的或更好的方法来覆盖这种可能性

String result = ObjectUtils.defaultIfNull(jsonObj.get(date), _default)

如果您的依赖项是apache lang3。

那么默认值是多少?创建的异常是哪一行?什么是最新的?dateFromJson必须为null,因为这是假定数据==日期的日期值