JSON 驗證工具
先進的線上 JSON 語法驗證器與結構檢查工具 — 完全瀏覽器執行且以隱私保護為首要。
立即驗證您的 JSON
這款免費的線上 JSON 驗證器讓您即時檢查 JSON 資料的語法錯誤及結構問題。無論您是在驗證原始 API 回應、設定檔案,或是結構化資料,我們的工具都能即時標示錯誤,甚至提供自動修復功能。若需更嚴格的驗證,您可加入 JSON Schema,強制執行必填欄位、特定類型及格式(如電子郵件、URI 等)等規則。本工具完全符合 JSON Schema Draft-07 標準,所有處理皆在您的瀏覽器中完成,資料絕不離開您的裝置。
什麼是 JSON 驗證?
JSON(JavaScript 物件表示法)是一種廣泛採用的輕量級資料交換格式,設計目的是兼具易讀性與能被機器輕鬆解析與生成。它的主要用途是以語言無關的方式表示結構化資料——包括物件、陣列、字串、數字、布林值及 null,適用於各種程式語言和平台。
JSON 驗證是以程式方式確認 JSON 文件在語法和結構上皆正確的過程。這包含檢查兩個主要方面:
- 語法驗證: 確保原始文本遵循由 ECMA-404 JSON 規範所定義的正式語法。大多數現代程式語言中的解析器(例如 JavaScript 的 JSON.parse()、Python 的 json.loads()、Java 的 JSONDecoder)都期望輸入為有效語法,若格式錯誤將拋出錯誤訊息。
- 結構化(架構)驗證: 除了語法,架構驗證還會檢查 JSON 資料是否符合預期結構,包括資料類型、必填屬性、數值限制以及巢狀物件或陣列。架構驗證通常使用 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": "Tom 說『哈囉』" }
{ "quote": "湯姆說:\"你好\"" }
其他跳脫字元包括用 \\ 表示反斜線、\n 表示換行符號,以及 \t 表示製表符。
資料類型不正確
字串不應用於數字、布林值或空值。
{ "enabled": "true", "count": "10" }
{ "enabled": true, "count": 10 }
JSON 區分布林值、數字與字串——確保使用正確的資料類型。
非原始鍵
JSON 物件的鍵必須始終是字串;不能使用數字、布林值或其他類型作為鍵。
{ 123: "abc" }
{ "123": "abc" }
重複鍵
雖然 JSON 規範允許,但重複鍵通常是造成錯誤的常見原因。
{ "name": "愛麗絲", "name": "鮑勃" }
大多數解析器只會保留最後一個值("Bob"),並默默捨棄先前的值。
使用評論
標準 JSON 不允許使用註解,儘管某些編輯器支持註解功能。
{ // 使用者資訊 "name": "Alice" }
{ "name": "愛麗絲" }
結構驗證:強制執行結構與資料類型
JSON Schema 是一個強大的標準,用於定義和驗證 JSON 文件的預期結構。它允許您指定:
- 必填欄位(`required`)
- 資料類型(`type`:字串、數字、布林值、物件、陣列、空值)
- 字串格式(`format`:電子郵件、UUID、日期時間等)
- 字串的模式匹配(`pattern`)
- 數字範圍(`最小值`,`最大值`)
- 陣列長度與元素驗證(`minItems`、`maxItems`、`items`)
- 物件與陣列的巢狀驗證
- 列舉約束(`enum`)
範例:用戶結構(草案-07)
{ "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string", "minLength": 1 }, "email": { "type": "string", "format": "email" }, "is_active": { "type": "boolean" } }, "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": [ "requires_payment_method", "需要付款方式", "requires_confirmation", "需要確認", "processing", "處理中", "succeeded", "成功", "canceled" "已取消" ]} }, "required": ["id", "object", "amount", "currency", "status"], "additionalProperties": false }
- ID 必須以「pi_」開頭
- 物件必須始終為「payment_intent」
- 金額必須是大於或等於 1 的整數
- 貨幣必須是三個字母的字串(例如,「usd」、「eur」)
- 狀態必須是指定的值之一
好處
- 早期錯誤偵測:在資料傳入您的業務邏輯之前,捕捉破壞性的 API 變更或不完整的數據。
- 自動化測試:在 CI/CD 管道中使用結構化模式驗證真實與模擬回應。
- 跨團隊一致性:在前端、後端與第三方 API 之間標準化資料合約,確保數據一致性與整合效率。
正確的 JSON 驗證——涵蓋語法與結構模式(schema)——可防止細微錯誤,強化最佳實踐,並保護您的應用程式免受格式錯誤或惡意輸入的威脅。無論是在設定檔、API 載荷或服務間通訊中使用,強健的驗證機制都是現代軟體系統的基石。
隱私與安全
所有驗證和結構檢查均在您的瀏覽器本地運行。無任何資料上傳或記錄。您的 JSON 完全保密。
JSON 驗證範例程式碼
了解如何使用內建函式庫或熱門框架,在多種程式語言中驗證 JSON。這些範例示範了語法驗證和結構(Schema)驗證的方法,助您提升資料正確性與可靠性。
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 團隊開發,我們是多款快速且以隱私為優先的線上工具的創造者,全球數百萬用戶信賴使用。憑藉多年打造瀏覽器工具的經驗,強調簡潔、速度與穩定,我們拓展至專為開發者設計的應用程式,如此工具,旨在協助程式設計師、分析師及數位專業人士輕鬆完成技術工作。