JSON 校验器
先进的在线JSON语法验证器和模式检查工具——完全基于浏览器,隐私保护优先。
即时验证您的JSON
这个免费在线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。示例涵盖语法验证和模式验证,帮助您确保数据结构的正确性和一致性。
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);
}
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));
import json
try:
obj = json.loads('{"name":"Alice","age":30}')
print("Valid JSON:", obj)
except json.JSONDecodeError as e:
print("Invalid JSON:", e)
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)
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)
}
}
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());
}
}
}
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
$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();
}
require 'json'
begin
obj = JSON.parse('{"name":"Alice","age":30}')
puts "Valid JSON!"
rescue JSON::ParserError => e
puts "Invalid JSON: #{e.message}"
end
echo '{"name":"Alice","age":30}' | jq empty && echo "Valid" || echo "Invalid"
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),
}
}
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}")
}
}
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)")
}
}
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);
}
SELECT '{"name":"Alice","age":30}'::jsonb; -- Will error if not valid JSON
SELECT JSON_VALID('{"name":"Alice","age":30}');
$json = '{"name":"Alice","age":30}'
try {
$obj = $json | ConvertFrom-Json
Write-Output "Valid JSON!"
} catch {
Write-Output "Invalid JSON: $($_.Exception.Message)"
}
use JSON;
my $str = '{"name":"Alice","age":30}';
eval { decode_json($str) };
print $@ ? "Invalid JSON: $@" : "Valid JSON!";
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');
}
}
json = ~s({"name":"Alice","age":30})
case Jason.decode(json) do
{:ok, _} -> IO.puts("Valid JSON!")
{:error, err} -> IO.puts("Invalid JSON: #{err}")
end
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 团队开发,他们是推出多款快速且注重隐私的在线实用工具的创始者,受到全球数百万用户的青睐。凭借多年构建简洁、高速且可靠的浏览器工具的经验,我们已拓展至面向开发者的应用程序,如本工具,旨在帮助程序员、分析师和数字专业人士更轻松地完成技术任务。