JSON 驗證工具

先進的線上 JSON 語法驗證器與結構檢查工具 — 完全瀏覽器執行且以隱私保護為首要。

立即驗證您的 JSON

使用架構驗證 JSON
支援的架構版本:Draft-07 草案

這款免費的線上 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)驗證的方法,助您提升資料正確性與可靠性。

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 團隊開發,我們是多款快速且以隱私為優先的線上工具的創造者,全球數百萬用戶信賴使用。憑藉多年打造瀏覽器工具的經驗,強調簡潔、速度與穩定,我們拓展至專為開發者設計的應用程式,如此工具,旨在協助程式設計師、分析師及數位專業人士輕鬆完成技術工作。