JSON 校验器

先进的在线JSON语法验证器和模式检查工具——完全基于浏览器,隐私保护优先。

即时验证您的JSON

使用模式验证 JSON 数据
支持的模式版本:草案-07

这个免费在线JSON校验器可帮助您即时检查JSON数据中的语法错误和结构问题。无论您是在验证原始API响应、配置文件,还是结构化的数据载荷,我们的工具都能实时突出显示问题,甚至提供自动修复功能。若需更严格的校验,您可以添加JSON Schema,强制执行必填字段、特定类型和格式(如电子邮件、URI等)等规则。该工具完全兼容JSON Schema Draft-07。所有处理均在您的浏览器中完成,您的数据绝不会离开您的设备。

什么是JSON验证?

JSON(JavaScript 对象表示法)是一种广泛应用的轻量级数据交换格式,旨在使数据既易于人类阅读,又方便机器解析和生成。它的主要用途是以语言无关的方式表示结构化数据——包括对象、数组、字符串、数字、布尔值和空值。

JSON 校验是通过编程方式验证 JSON 文档在语法和结构上是否正确的过程。主要包括以下两个方面的检查:

  • 句法验证: 确保原始文本遵循 ECMA-404 JSON 规范中定义的正式语法。大多数现代编程语言中的解析器(例如 JavaScript 的 JSON.parse()、Python 的 json.loads() 以及 Java 的 JSONDecoder)都要求语法有效,若输入格式错误将会抛出异常。
  • 结构化(Schema)验证: 除了语法之外,模式验证还会检查 JSON 数据是否符合预期结构,包括数据类型、必填属性、数值约束以及嵌套对象/数组。模式验证通常采用 JSON Schema 完成,JSON Schema 定义了数据有效性的规则,确保数据符合规范。

为什么要验证 JSON?

无论是在传输、存储还是服务间通信中,只要涉及数据序列化,JSON 校验都是至关重要的。主要原因包括:

  • 错误预防:在尝试处理数据之前,及早检测并报告语法错误(例如,缺少逗号、括号不匹配、非法字符),提升代码质量与运行稳定性。
  • 数据完整性与安全性:拒绝格式错误或恶意的JSON负载,帮助防止后端崩溃、注入攻击及数据损坏。
  • 类型安全:强制执行严格的类型约束——确保例如期望为布尔值的字段不会以字符串形式传递,或者确保UUID、电子邮件地址和数字遵循正确的格式。
  • 跨语言兼容性:确保在一个环境(例如 Node.js)中生成的 JSON 能够在另一个环境(例如 Python、Go、Java)中安全使用,避免序列化/反序列化错误。
  • 可维护性与稳健性:经过验证的数据结构提升可追溯性,减少配置文件、日志或API请求/响应中难以调试错误的风险。
  • 隐私与安全:验证过程完全在客户端(浏览器内)进行,防止用户的原始或敏感数据在验证时离开设备,保障数据安全。

常见的JSON验证错误(附详细示例)

未加引号的键

JSON 对象中的所有键必须是双引号括起来的字符串。

{ 名字: "爱丽丝" }
{ "name": "爱丽丝" }

许多类JSON格式(例如,JavaScript对象字面量)允许键不加引号,但标准JSON不支持这种写法。

单引号

JSON 字符串必须只使用双引号;不允许使用单引号。

{ 'name': '鲍勃' }
{ "name": "鲍勃" }

使用单引号将在所有符合标准的JSON库中导致解析错误。

尾随逗号

对象或数组的最后一项后不得有尾随逗号。

{
  "a": 1,
  "b": 2,
}
{
  "a": 1,
  "b": 2
}

尾随逗号在JavaScript中可能有效,但在严格的JSON解析器中不被支持。

字符转义不当

字符串中的引号和特殊字符必须使用反斜杠进行转义。

{ "quote": "汤姆说:\"你好\"" }
{ "quote": "汤姆说:\"你好\"" }

其他转义序列包括用于反斜杠的\\,用于换行的\n,以及用于制表符的\t。

数据类型错误

数字、布尔值或空值不应使用字符串表示。

{ "enabled": "true", "count": "10" }
{ "enabled": true, "count": 10 }

JSON 区分布尔值、数字和字符串——确保使用正确的数据类型。

非原始键

JSON 对象的键必须始终是字符串;不能使用数字、布尔值或其他类型作为键。

{ 123: "abc" }
{ "123": "abc" }

重复键

虽然 JSON 规范允许,但重复键是常见的错误来源。

{ "name": "爱丽丝", "name": "鲍勃" }

大多数解析器只会保留最后一个值(“Bob”),并悄无声息地丢弃之前的值。

评论的使用

标准 JSON 不允许包含注释,尽管某些编辑器支持注释功能。

{
  // 用户信息
  "name": "爱丽丝"
}
{
  "name": "爱丽丝"
}

模式验证:强制执行结构和数据类型

JSON Schema 是一种强大的标准,用于定义和验证 JSON 文档的预期结构。它允许您指定:

  • 必填字段(`required`)
  • 数据类型(`type`:字符串,数字,布尔值,对象,数组,空值)
  • 字符串格式(`format`:电子邮件、UUID、日期时间等)
  • 字符串的模式匹配(`pattern`)
  • 数字范围(`最小值`,`最大值`)
  • 数组长度和项目验证(`minItems`,`maxItems`,`items`)
  • 对象和数组的嵌套校验
  • 枚举约束(`enum`)

示例:用户模式(草案-07版)

{
  "type": "对象",
  "properties": {
    "id":    { "type": "字符串", "format": "uuid" },
    "name":  { "type": "字符串", "minLength": 1 },
    "email": { "type": "字符串", "format": "电子邮件" },
    "is_active": { "type": "布尔值" }
  },
  "required": ["id", "name", "email"],
  "additionalProperties": false
}

本条款强制执行的内容:

  • ID 必须是有效的 UUID 字符串。
  • 名称必须是非空字符串。
  • 邮箱格式必须符合标准电子邮件格式。
  • is_active(可选)必须是布尔值。
  • 除上述定义的属性外,不允许使用其他属性。

真实案例:验证 Stripe API 响应的有效性

假设您从 Stripe API(例如 PaymentIntent)接收 JSON 响应。模式验证可以确保您永远不会处理不完整或类型错误的数据。

{
  "type": "object",
  "properties": {
    "id":      { "type": "string", "pattern": "^pi_" },
    "object":  { "type": "string", "const": "payment_intent" },
    "amount":  { "type": "integer", "minimum": 1 },
    "currency":{ "type": "string", "minLength": 3, "maxLength": 3 },
    "status":  { "type": "string", "enum": [
      "需要付款方式",
      "等待确认",
      "处理中",
      "支付成功",
      "已取消"
    ]}
  },
  "required": ["id", "object", "amount", "currency", "status"],
  "additionalProperties": false
}
  • ID 必须以 "pi_" 开头
  • 对象必须始终为“payment_intent”
  • 数量必须是大于或等于1的整数
  • 货币代码必须是三个字母的字符串(例如,“usd”,“eur”)
  • 状态必须是指定的值之一

优势

  • 早期错误检测:在数据到达您的业务逻辑之前,捕捉关键API变化或不完整数据。
  • 自动化测试:在 CI/CD 流水线中使用模式验证真实和模拟响应。
  • 跨团队一致性:统一前端、后端及第三方 API 之间的数据契约,确保高效协同与数据规范。

正确的JSON验证——涵盖语法和模式——可以防止细微的错误,确保最佳实践,并保护您的应用免受格式错误或恶意输入的影响。无论用于配置文件、API数据传输,还是服务间消息交换,强大的验证机制都是现代软件系统的基础保障。

隐私与安全

所有验证和模式检查均在您的浏览器本地运行。无需上传或记录任何数据,您的 JSON 完全私密安全。

JSON 验证代码示例

了解如何使用内置库或流行框架在多种编程语言中验证 JSON。示例涵盖语法验证和模式验证,帮助您确保数据结构的正确性和一致性。

JavaScript (Node.js)
Install: Standard library
const jsonString = '{"name":"Alice","age":30}';
try {
  const obj = JSON.parse(jsonString);
  console.log("Valid JSON:", obj);
} catch (e) {
  console.error("Invalid JSON!", e.message);
}
JavaScript (Node.js) with ajv (Schema validation)
Install: npm install ajv
const Ajv = require("ajv");
const ajv = new Ajv();
const schema = { type: "object", properties: { age: { type: "integer" } }, required: ["age"] };
const data = { age: 30 };
const validate = ajv.compile(schema);
console.log(validate(data) ? "Valid!" : ajv.errorsText(validate.errors));
Python
Install: Standard library (json)
import json
try:
    obj = json.loads('{"name":"Alice","age":30}')
    print("Valid JSON:", obj)
except json.JSONDecodeError as e:
    print("Invalid JSON:", e)
Python with jsonschema
Install: pip install jsonschema
import json, jsonschema
schema = {
    "type": "object",
    "properties": { "age": { "type": "integer" } },
    "required": ["age"]
}
data = {"age": 30}
try:
    jsonschema.validate(data, schema)
    print("Valid!")
except jsonschema.ValidationError as e:
    print("Schema validation error:", e)
Go
Install: Standard library (encoding/json)
package main
import (
  "encoding/json"
  "fmt"
)
func main() {
  data := []byte(`{"name":"Alice","age":30}`)
  var obj map[string]interface{}
  if err := json.Unmarshal(data, &obj); err != nil {
    fmt.Println("Invalid JSON:", err)
  } else {
    fmt.Println("Valid JSON:", obj)
  }
}
Java
Install: com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
  public static void main(String[] args) {
    String json = "{"name":"Alice","age":30}";
    try {
      Object obj = new ObjectMapper().readTree(json);
      System.out.println("Valid JSON: " + obj);
    } catch (Exception e) {
      System.out.println("Invalid JSON: " + e.getMessage());
    }
  }
}
C#
Install: Standard library (System.Text.Json)
using System;
using System.Text.Json;
class Program {
  static void Main() {
    string json = "{"name":"Alice","age":30}";
    try {
      var doc = JsonDocument.Parse(json);
      Console.WriteLine("Valid JSON!");
    } catch (JsonException e) {
      Console.WriteLine("Invalid JSON: " + e.Message);
    }
  }
}
PHP
Install: Standard library (json_decode)
<?php
$json = '{"name":"Alice","age":30}';
$obj = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
  echo "Valid JSON";
} else {
  echo "Invalid JSON: " . json_last_error_msg();
}
Ruby
Install: Standard library (json)
require 'json'
begin
  obj = JSON.parse('{"name":"Alice","age":30}')
  puts "Valid JSON!"
rescue JSON::ParserError => e
  puts "Invalid JSON: #{e.message}"
end
Bash (Linux/macOS) with jq
Install: brew install jq (or apt-get install jq)
echo '{"name":"Alice","age":30}' | jq empty && echo "Valid" || echo "Invalid"
Rust
Install: cargo add serde_json
fn main() {
  let data = r#"{"name":"Alice","age":30}"#;
  match serde_json::from_str::<serde_json::Value>(data) {
    Ok(_) => println!("Valid JSON!"),
    Err(e) => println!("Invalid JSON: {}", e),
  }
}
Kotlin
Install: Standard library (org.json)
import org.json.JSONObject
fun main() {
  try {
    val obj = JSONObject("{\"name\":\"Alice\",\"age\":30}")
    println("Valid JSON: $obj")
  } catch (e: Exception) {
    println("Invalid JSON: ${e.message}")
  }
}
Swift
Install: Standard library (JSONSerialization)
import Foundation
let json = "{\"name\":\"Alice\",\"age\":30}"
if let data = json.data(using: .utf8) {
  do {
    let _ = try JSONSerialization.jsonObject(with: data)
    print("Valid JSON!")
  } catch {
    print("Invalid JSON: \(error)")
  }
}
TypeScript
Install: Standard library
const jsonString = '{"name":"Alice","age":30}';
try {
  const obj = JSON.parse(jsonString);
  console.log("Valid JSON:", obj);
} catch (e) {
  console.error("Invalid JSON!", e.message);
}
SQL (PostgreSQL)
Install: Standard (with jsonb functions)
SELECT '{"name":"Alice","age":30}'::jsonb; -- Will error if not valid JSON
MySQL
Install: Standard (5.7+)
SELECT JSON_VALID('{"name":"Alice","age":30}');
PowerShell
Install: Standard
$json = '{"name":"Alice","age":30}'
try {
  $obj = $json | ConvertFrom-Json
  Write-Output "Valid JSON!"
} catch {
  Write-Output "Invalid JSON: $($_.Exception.Message)"
}
Perl
Install: cpan JSON
use JSON;
my $str = '{"name":"Alice","age":30}';
eval { decode_json($str) };
print $@ ? "Invalid JSON: $@" : "Valid JSON!";
Dart
Install: Standard library (dart:convert)
import 'dart:convert';
void main() {
  const jsonString = '{"name":"Alice","age":30}';
  try {
    final obj = jsonDecode(jsonString);
    print('Valid JSON: $obj');
  } catch (e) {
    print('Invalid JSON: $e');
  }
}
Elixir
Install: mix deps.get jason
json = ~s({"name":"Alice","age":30})
case Jason.decode(json) do
  {:ok, _} -> IO.puts("Valid JSON!")
  {:error, err} -> IO.puts("Invalid JSON: #{err}")
end
Scala
Install: libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.4"
import play.api.libs.json._
object Main extends App {
  val str = """{"name":"Alice","age":30}"""
  try {
    val json = Json.parse(str)
    println("Valid JSON!")
  } catch {
    case e: Exception => println("Invalid JSON: " + e.getMessage)
  }
}

关于此工具

此工具由 Itself Tools 团队开发,他们是推出多款快速且注重隐私的在线实用工具的创始者,受到全球数百万用户的青睐。凭借多年构建简洁、高速且可靠的浏览器工具的经验,我们已拓展至面向开发者的应用程序,如本工具,旨在帮助程序员、分析师和数字专业人士更轻松地完成技术任务。