java - Spring验证字符串值是JSON

标签 java json spring validation annotations

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

我希望 Spring 在注入(inject)之前验证该值确实是有效的 JSON,否则抛出错误。

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

有什么方法可以创建自定义 validator 吗?

我想要一个 validator 来尝试将字符串转换为 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 {};
}

...以及 validator 通过注释处理验证:

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 中有详细描述。 .

关于java - Spring验证字符串值是JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203967/

相关文章:

java - Android Java 在单独的线程中运行类似于 C# 风格的 Action 列表

javascript - 将用户添加到网页后获取的数据生成 json 文件

spring - 过早关闭异常 : Connection prematurely closed

c# - 如何反序列化嵌套的 JSON 数组?

java - 如何对 Spring bean 隐藏方法?

Spring Data JPA - 规范和 Querydsl

java - 无法在 Android 中使用 SimpleDateFormat 解析 MYSQL 时间戳

java - Python 和 Java 之间的 For 循环区别

java - 将 JTable 内容保存为文本文件

c# - 返回 JSON 错误消息,IActionResult