校验 JSON 格式是否合法的 Java 实现

引言

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,常用于前后端数据传递。在开发过程中,我们经常需要校验 JSON 格式的合法性,以确保数据的正确性和一致性。本文将介绍如何使用 Java 进行 JSON 格式的校验,并提供了示例代码。

JSON 格式简介

JSON 是一种基于键值对的数据格式,可以表示数组和对象。下面是一个简单的 JSON 示例:

{
  "name": "John",
  "age": 25,
  "address": {
    "city": "New York",
    "state": "NY"
  }
}

该 JSON 由一个对象组成,包含三个属性:name、age 和 address。其中,address 属性又是一个嵌套的对象。

JSON 格式的校验方法

在 Java 中,我们可以使用第三方库来校验 JSON 格式的合法性。下面以 Jackson 库为例,介绍两种常用的校验方法。

方法一:使用 ObjectMapper

Jackson 提供了 ObjectMapper 类,可以将 JSON 字符串转换为 Java 对象,并进行校验。下面是一个使用 ObjectMapper 校验 JSON 的示例代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonParseException;

public class JsonValidator {
    public static boolean validate(String jsonString) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            objectMapper.readTree(jsonString);
            return true;
        } catch (JsonParseException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        String jsonString = "{\"name\":\"John\",\"age\":25}";
        boolean isValid = validate(jsonString);
        System.out.println("JSON is valid: " + isValid);
    }
}

上述代码中,我们定义了一个 validate 方法,通过 objectMapper.readTree(jsonString) 方法尝试将 JSON 字符串转换为树状结构。如果转换成功,说明 JSON 格式合法;如果转换失败,会抛出 JsonParseException 异常,我们可以通过捕获异常判断 JSON 是否合法。在 main 方法中,我们提供了一个示例的 JSON 字符串,并打印校验结果。

方法二:使用 JSON 校验工具类

除了使用 ObjectMapper,我们还可以使用 JSON 校验工具类来判断 JSON 是否合法。下面是一个使用 JSON 校验工具类的示例代码:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
import com.github.fge.jsonschema.main.JsonSchema;
import com.github.fge.jsonschema.main.JsonSchemaFactory;

public class JsonValidator {
    public static boolean validate(String jsonString, String schemaString) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(jsonString);
            
            JsonNode schemaNode = objectMapper.readTree(schemaString);
            JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
            JsonSchema schema = factory.getJsonSchema(schemaNode);
            
            return schema.validInstance(jsonNode);
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) {
        String jsonString = "{\"name\":\"John\",\"age\":25}";
        String schemaString = "{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"age\":{\"type\":\"integer\"}}}";

        boolean isValid = validate(jsonString, schemaString);
        System.out.println("JSON is valid: " + isValid);
    }
}

上述代码中,我们使用了 JSON 校验工具类提供的 JsonSchema 类,该类可以根据 JSON Schema 定义的规则对 JSON 进行校验。首先,我们通过 objectMapper.readTree(jsonString) 将 JSON 字符串转换为 JsonNode 对象,再通过 objectMapper.readTree(schemaString) 将 JSON Schema 字符串转换为 JsonNode 对象。然后,创建 JsonSchemaFactory 对象和 JsonSchema 对象,并调用 schema.validInstance(jsonNode) 方法对 JSON 进行校验。

序列图

下面是一个使用 Jackson 校验 JSON 的序列图,展示了整个校验过程的交互流程:

sequenceDiagram
    participant Client
    participant Server
    participant ObjectMapper
    Note over Client, Server: JSON 校验
    Client->>Server: 发起校验请求
    Server->>ObjectMapper: 转换 JSON 字符串