Spring 验证字符串值是 JSON

Spring validate string value is a JSON

我的配置文件中有一些值,应该是 JSON(将作为字符串加载)。

我想 Spring 在注入之前验证这个值确实是有效的 JSON 并抛出错误。

我已经阅读了存在的验证注释,例如 - @NotNull@Size@Min@Max@Email@NotEmpty

有什么方法可以创建自定义验证器吗?

我想要一个尝试将字符串转换为 JSON 的验证器,如下例所示:How to convert jsonString to JSONObject in Java.

这不是由可用的验证注释提供的,因此您必须寻求自定义实现。该任务分为 2 个简单步骤:

1.给定的字符串是否为 JSON 格式

有多个库能够解析(因此验证)字符串是否遵循 JSON 语法标准。让我们以我最喜欢的 GSON 为例(有 many)。这取决于你目前使用的是什么库:

String string = "{\"foo\":\"bar\"}"
JsonParser jsonParser = new JsonParser();
try {
    jsonParser.parse(string);       // valid JSON
} catch (JsonSyntaxException ex) { 
    /* exception handling */        // invalid JSON
}

2。自定义验证注释

从提供启用验证的依赖项开始:

  • groupId: org.hibernate
  • artifactId:hibernate-validator

创建用于验证的注释:

@Documented
@Constraint(validatedBy = JsonStringValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonString {
    String message() default "The String is not in JSON format";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

...和验证器通过注解处理验证:

public class JsonStringValidator implements ConstraintValidator<JsonString, String> {

    @Override
    public void initialize(JsonString jsonString) { }

    @Override
    public boolean isValid(String string, ConstraintValidatorContext context) {
        // Use an implementation from step 1. A brief example:
        try {
            new JsonParser().parse(string);
            return true;                    // valid JSON, return true
        } catch (JsonSyntaxException ex) { 
            /* exception handling if needed */
        }
        return false;                       // invalid JSON, return false
    }
}

用法非常简单:

@JsonString
private String expectedJsonString

此实现在 Baeldung's 中有详细描述。