一个空的JSON字段在Java模型中是一个布尔值/可为null的字段,正在转换为null

一个空的JSON字段在Java模型中是一个布尔值/可为null的字段,正在转换为null,java,json,jackson,deserialization,json-deserialization,Java,Json,Jackson,Deserialization,Json Deserialization,我有一个特别的要求,在 如果请求JSON正文中没有(布尔类型)字段,则该请求有效 如果此字段设置为布尔值(true或false),则它显然有效 如果字段具有非布尔值,则应引发异常 如果该字段的值为空,它应该抛出异常 即使Java模型在字段通过类型检查为非布尔值时抛出异常,空值也被转换为null。相反,我需要能够区分它并抛出异常。如何才能做到这一点 下面是我如何定义post body模型的,我使用的是AutoValue生成器,因此对于手工编写的字段,我没有setter函数。此外,我正在使用fa

我有一个特别的要求,在

  • 如果请求
    JSON
    正文中没有(布尔类型)字段,则该请求有效
  • 如果此字段设置为布尔值(
    true
    false
    ),则它显然有效
  • 如果字段具有非布尔值,则应引发异常
  • 如果该字段的值为空它应该抛出异常
即使
Java
模型在字段通过类型检查为非布尔值时抛出异常,空值也被转换为null。相反,我需要能够区分它并抛出异常。如何才能做到这一点

下面是我如何定义post body模型的,我使用的是AutoValue生成器,因此对于手工编写的字段,我没有setter函数。此外,我正在使用fasterxml库

@JsonProperty("indicator")
@Nullable
public abstract Boolean getIndicator();
我尝试定义一个自定义注释并编写逻辑来检查值是否为空,但没有成功。

您需要禁用允许在类似情况下强制的功能。请参见以下示例:

import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        String json = "{\"indicator\":\"\"}";

        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(MapperFeature.ALLOW_COERCION_OF_SCALARS);
        System.out.println(mapper.readValue(json, BaseClass.class));
    }
}

class BaseClass {
    private Boolean indicator;

    public Boolean getIndicator() {
        return indicator;
    }

    public void setIndicator(Boolean indicator) {
        this.indicator = indicator;
    }

    @Override
    public String toString() {
        return "BaseClass{" +
                "indicator=" + indicator +
                '}';
    }
}
以上代码打印:

线程“main”中出现异常 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法 将类型
java.lang.Boolean
(启用
MapperFeature.允许对\u标量进行强制\u
[来源:(字符串)“{”指示符“:”};行:1,列:14](通过)
参考链:基类[“指标”])


将空值视为null是您正在使用的JSON解析器的一个特性。由于我们不知道您使用的是哪种JSON解析器,因此我们无法真正帮助您找出如何重新配置它,使其不将空视为空,现在可以吗?@Andreas,感谢您的回复。我使用fasterxml库作为JSON解析器