从 JSON 反序列化时,我可以限制可能的值吗?

Can I restrict the possible values when deserializing from JSON?

我正在使用 fasterxml 库,我有以下内容:

public class Test {
    public String value;
}

...

import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static final ObjectMapper mapper = new ObjectMapper();

    public static void main(String[] args) throws IOException {
        String json = "{\"value\":\"foo\"}";
        Test t = mapper.readValue(json, Test.class);
    }
}

是否可以限制可能的值value可以?

例如,如果 JSON 是“{"value":"bar"}”,我希望 Test t = mapper.readValue(json, Test.class); 抛出异常(或以某种方式指示错误) .

直接通过 FasterXML (Jackson 2),没有。它将做的唯一验证是从 JSON 类型到相应的 Java 类型的可能转换。

您可以在用于相应字段的 setter 中自己进行验证,抛出运行时异常。例如

@JsonProperty("value")
public String setValue(String value) {
    if ("bar".equals(value)) {
        throw new RuntimeException("value " + value + " is inappropriate.");
    }
    this.value = value;
}

您还可以编写一个自定义 JsonDeserializer 来执行验证并在不适当的值上失败。有一个编写反序列化器的示例 here 和其他教程。