杰瑞科技汇

Java如何判断JSON格式是否正确?

在 Java 中判断一个字符串是否为有效的 JSON 格式,主要有以下几种方法,它们各有优劣,适用于不同的场景。

使用 org.json 库 (简单直接)

这是最常用和最简单的方法之一,你需要先添加 org.json 库的依赖。

添加依赖 (Maven)

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20251013</version> <!-- 使用最新版本 -->
</dependency>

代码示例

org.json 库提供了一个 JSONException,我们可以尝试解析字符串,如果捕获到这个异常,就说明字符串不是有效的 JSON。

import org.json.JSONException;
import org.json.JSONObject;
public class JsonValidator {
    /**
     * 使用 org.json 库判断字符串是否为有效的 JSON 对象
     * @param jsonString 要检查的字符串
     * @return 如果是有效的 JSON 对象则返回 true,否则返回 false
     */
    public static boolean isValidJsonObject(String jsonString) {
        if (jsonString == null || jsonString.trim().isEmpty()) {
            return false;
        }
        try {
            new JSONObject(jsonString);
            return true;
        } catch (JSONException e) {
            return false;
        }
    }
    /**
     * 使用 org.json 库判断字符串是否为有效的 JSON 数组
     * @param jsonString 要检查的字符串
     * @return 如果是有效的 JSON 数组则返回 true,否则返回 false
     */
    public static boolean isValidJsonArray(String jsonString) {
        if (jsonString == null || jsonString.trim().isEmpty()) {
            return false;
        }
        try {
            new org.json.JSONArray(jsonString);
            return true;
        } catch (JSONException e) {
            return false;
        }
    }
    /**
     * 判断字符串是否为有效的 JSON (对象或数组)
     * @param jsonString 要检查的字符串
     * @return 如果是有效的 JSON 对象或数组则返回 true,否则返回 false
     */
    public static boolean isValidJson(String jsonString) {
        return isValidJsonObject(jsonString) || isValidJsonArray(jsonString);
    }
    public static void main(String[] args) {
        String validObject = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}";
        String validArray = "[\"apple\", \"banana\", \"cherry\"]";
        String invalidJson = "{name: 'John', age: 30}"; // 属性名必须双引号
        String plainText = "This is just a plain string.";
        System.out.println("Is '" + validObject + "' valid JSON? " + isValidJson(validObject)); // true
        System.out.println("Is '" + validArray + "' valid JSON? " + isValidJson(validArray));   // true
        System.out.println("Is '" + invalidJson + "' valid JSON? " + isValidJson(invalidJson)); // false
        System.out.println("Is '" + plainText + "' valid JSON? " + isValidJson(plainText));   // false
    }
}

使用 JacksonGson 库 (更强大,与项目集成度高)

如果你的项目已经在使用 Jackson 或 Gson 进行 JSON 序列化/反序列化,那么直接使用它们来校验是最自然的选择。

使用 Jackson

首先添加 Jackson 依赖 (Maven):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>

代码示例:

Jackson 的核心类是 ObjectMapper,我们可以调用其 readTree() 方法,它会返回一个 JsonNode,如果解析失败,会抛出 JsonProcessingException

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonJsonValidator {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public static boolean isValidJson(String jsonString) {
        if (jsonString == null || jsonString.trim().isEmpty()) {
            return false;
        }
        try {
            objectMapper.readTree(jsonString);
            return true;
        } catch (JsonProcessingException e) {
            return false;
        }
    }
    public static void main(String[] args) {
        String validJson = "{\"name\": \"John\", \"age\": 30}";
        String invalidJson = "{name: 'John', age: 30}";
        System.out.println("Is '" + validJson + "' valid JSON? " + isValidJson(validJson)); // true
        System.out.println("Is '" + invalidJson + "' valid JSON? " + isValidJson(invalidJson)); // false
    }
}

使用 Gson

首先添加 Gson 依赖 (Maven):

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>

代码示例:

Gson 的核心类是 JsonParser,我们可以调用其 parse() 方法,它会返回一个 JsonElement,如果解析失败,会抛出 JsonSyntaxException

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
public class GsonJsonValidator {
    public static boolean isValidJson(String jsonString) {
        if (jsonString == null || jsonString.trim().isEmpty()) {
            return false;
        }
        try {
            JsonParser.parseString(jsonString);
            return true;
        } catch (JsonSyntaxException e) {
            return false;
        }
    }
    public static void main(String[] args) {
        String validJson = "{\"name\": \"John\", \"age\": 30}";
        String invalidJson = "{name: 'John', age: 30}";
        System.out.println("Is '" + validJson + "' valid JSON? " + isValidJson(validJson)); // true
        System.out.println("Is '" + invalidJson + "' valid JSON? " + isValidJson(invalidJson)); // false
    }
}

使用 Java 8 的 javax.json (JSR 374) API (标准 API)

这是 Java 官方的 JSON 处理标准 API,如果你不想引入第三方库,这是一个不错的选择。

添加依赖 (Maven)

javax.json 通常需要你选择一个具体的实现,org.glassfish

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.4</version>
</dependency>

代码示例

javax.json 提供了 JsonReader,我们可以尝试用它来解析字符串,如果解析失败,会抛出 JsonException

import javax.json.Json;
import javax.json.JsonReader;
import java.io.StringReader;
public class JavaxJsonValidator {
    public static boolean isValidJson(String jsonString) {
        if (jsonString == null || jsonString.trim().isEmpty()) {
            return false;
        }
        try (JsonReader reader = Json.createReader(new StringReader(jsonString))) {
            reader.read(); // 尝试读取,如果成功则说明是有效的
            return true;
        } catch (Exception e) {
            // JsonException 或其他解析异常
            return false;
        }
    }
    public static void main(String[] args) {
        String validJson = "{\"name\": \"John\", \"age\": 30}";
        String invalidJson = "{name: 'John', age: 30}";
        System.out.println("Is '" + validJson + "' valid JSON? " + isValidJson(validJson)); // true
        System.out.println("Is '" + invalidJson + "' valid JSON? " + isValidJson(invalidJson)); // false
    }
}

总结与对比

方法 优点 缺点 适用场景
org.json 轻量级,API 简单,专门用于校验和简单操作 功能相对单一,不适合复杂的序列化/反序列化 快速校验 JSON 格式,或对 JSON 进行简单操作。
Jackson 功能强大,性能优秀,是 Java 生态中最流行的库之一 对于仅做校验来说可能有点“重” 你的项目已经在使用 Jackson,或者需要进行复杂的 JSON 处理。
Gson 功能强大,API 直观,易于使用 性能略逊于 Jackson 你的项目已经在使用 Gson,或者喜欢其简洁的 API。
javax.json Java 标准 API,无需额外引入第三方库 API 相对繁琐,社区和生态系统不如 Jackson/Gson 强 不希望引入第三方依赖,且项目环境支持 Java EE 或 Jakarta EE。

如何选择?

  • 如果你只是想快速判断一个字符串是不是 JSON,并且不想引入太大的库,org.json 是最佳选择
  • 如果你的项目已经使用了 Jackson 或 Gson,直接使用它们进行校验是最自然、最统一的方案。
  • 如果你是 Java 新手,或者追求最标准的实现,可以考虑 javax.json,但请注意它的 API 可能不如其他库友好。

对于绝大多数 Java org.jsonJackson 是判断 JSON 格式的最常用和推荐的方法。

分享:
扫描分享到社交APP
上一篇
下一篇