Trình kiểm tra JSON
Trình kiểm tra cú pháp JSON trực tuyến nâng cao và kiểm tra schema—hoạt động hoàn toàn trên trình duyệt và ưu tiên bảo mật riêng tư.
Xác thực JSON của bạn ngay lập tức
Trình kiểm tra JSON trực tuyến miễn phí này cho phép bạn ngay lập tức kiểm tra dữ liệu JSON của mình để phát hiện lỗi cú pháp và các vấn đề về cấu trúc. Dù bạn đang xác thực phản hồi API thô, tệp cấu hình hay các payload có cấu trúc, công cụ của chúng tôi sẽ tô sáng các lỗi trong thời gian thực và thậm chí cung cấp các sửa lỗi tự động. Để kiểm tra nghiêm ngặt hơn, bạn có thể thêm JSON Schema và áp dụng các quy tắc như trường bắt buộc, loại dữ liệu cụ thể và định dạng (email, URI, v.v.). Công cụ hoàn toàn tuân thủ JSON Schema Draft-07. Mọi xử lý đều diễn ra trong trình duyệt của bạn—dữ liệu của bạn không bao giờ rời thiết bị.
Xác thực JSON là gì?
JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu nhẹ, được sử dụng rộng rãi, thiết kế để vừa dễ đọc với con người vừa dễ phân tích và tạo ra bởi máy móc. Mục đích chính của nó là biểu diễn dữ liệu có cấu trúc—bao gồm đối tượng, mảng, chuỗi, số, giá trị boolean và null—một cách không phụ thuộc vào ngôn ngữ lập trình.
Xác thực JSON là quá trình kiểm tra tự động để đảm bảo rằng một tài liệu JSON vừa hợp lệ về cú pháp vừa đúng cấu trúc. Quá trình này bao gồm kiểm tra hai khía cạnh chính:
- Kiểm Tra Cú Pháp: Đảm bảo rằng văn bản thô tuân thủ ngữ pháp chính thức được định nghĩa bởi tiêu chuẩn JSON ECMA-404. Trình phân tích cú pháp trong hầu hết các ngôn ngữ lập trình hiện đại (ví dụ: JSON.parse() trong JavaScript, json.loads() trong Python, JSONDecoder trong Java) đều yêu cầu cú pháp hợp lệ và sẽ báo lỗi nếu dữ liệu đầu vào bị sai định dạng.
- Xác thực Cấu trúc (Schema): Ngoài cú pháp, kiểm tra hợp lệ theo schema kiểm tra dữ liệu JSON có khớp với cấu trúc mong đợi hay không, bao gồm các kiểu dữ liệu, thuộc tính bắt buộc, ràng buộc giá trị và các đối tượng/mảng lồng nhau. Việc kiểm tra hợp lệ theo schema thường được thực hiện bằng JSON Schema, một tiêu chuẩn định nghĩa các quy tắc để xác định dữ liệu hợp lệ.
Tại sao cần xác thực JSON?
Xác thực JSON là điều quan trọng ở mọi nơi có dữ liệu được tuần tự hóa để truyền tải, lưu trữ hoặc giao tiếp giữa các dịch vụ. Các lý do chính bao gồm:
- Phòng ngừa lỗi: Phát hiện và báo cáo lỗi cú pháp (ví dụ: thiếu dấu phẩy, ngoặc không khớp, ký tự không hợp lệ) sớm—trước khi cố gắng xử lý dữ liệu.
- Tính Toàn Vẹn và Bảo Mật Dữ Liệu: Từ chối các payload JSON bị sai định dạng hoặc có mục đích độc hại, giúp ngăn ngừa sập hệ thống backend, tấn công chèn mã và hỏng dữ liệu.
- An toàn kiểu dữ liệu: Tuân thủ kiểu dữ liệu nghiêm ngặt—đảm bảo, ví dụ, rằng một trường được kỳ vọng là boolean không bị gửi dưới dạng chuỗi, hoặc UUID, email, số phải tuân theo định dạng chính xác.
- Tương thích đa ngôn ngữ: Đảm bảo rằng JSON được tạo ra trong một môi trường (ví dụ: Node.js) sẽ được sử dụng an toàn trong môi trường khác (ví dụ: Python, Go, Java), tránh lỗi khi tuần tự hóa/giải tuần tự hóa.
- Dễ dàng bảo trì & Độ bền vững: Các cấu trúc dữ liệu được xác thực giúp nâng cao khả năng truy xuất và giảm thiểu rủi ro lỗi khó phát hiện trong các tệp cấu hình, nhật ký hoặc yêu cầu/phản hồi API.
- Quyền riêng tư & Bảo mật: Việc kiểm tra có thể được thực hiện hoàn toàn phía client (trên trình duyệt), ngăn chặn dữ liệu thô hoặc nhạy cảm rời khỏi thiết bị của người dùng để xác thực.
Các Lỗi Xác Thực JSON Phổ Biến (kèm Ví Dụ Chi Tiết)
Khóa Không Dấu Ngoặc
Tất cả các khóa trong đối tượng JSON phải là chuỗi được bao bởi dấu ngoặc kép đôi.
{ tên: "Alice" }
{ "name": "Alice" }
Nhiều định dạng giống JSON (ví dụ: các đối tượng literal trong JavaScript) cho phép khóa không có dấu ngoặc kép, nhưng JSON tiêu chuẩn thì không.
Dấu nháy đơn
Chuỗi JSON chỉ được sử dụng dấu ngoặc kép; dấu ngoặc đơn không được phép sử dụng.
{ 'name': 'Bob' }
{ "name": "Bob" }
Sử dụng dấu nháy đơn sẽ gây lỗi phân tích cú pháp trong tất cả các thư viện JSON tuân thủ tiêu chuẩn.
Dấu phẩy cuối dòng
Không có dấu phẩy ở cuối sau mục cuối cùng trong đối tượng hoặc mảng.
{ "a": 1, "b": 2, }
{ "a": 1, "b": 2 }
Dấu phẩy cuối dòng có thể hoạt động trong JavaScript, nhưng không được hỗ trợ trong các bộ phân tích cú pháp JSON nghiêm ngặt.
Thoát Ký Tự Không Đúng Cách
Dấu nháy và ký tự đặc biệt bên trong chuỗi phải được thoát bằng dấu gạch chéo ngược (backslash).
{ "quote": "Tom nói \"xin chào\"" }
{ "quote": "Tom nói \"xin chào\"" }
Các chuỗi thoát khác bao gồm \\ cho dấu gạch chéo ngược, \n cho xuống dòng và \t cho tab.
Kiểu Dữ Liệu Không Chính Xác
Không nên sử dụng chuỗi cho số, giá trị boolean hoặc null.
{ "enabled": "bật", "count": "10" }
{ "enabled": true, "count": 10 }
JSON phân biệt rõ giữa kiểu boolean, số và chuỗi — hãy đảm bảo sử dụng đúng loại dữ liệu.
Khóa Phi Nguyên Thủy
Các khóa trong đối tượng JSON luôn phải là chuỗi; bạn không thể sử dụng số, giá trị boolean hoặc các kiểu dữ liệu khác làm khóa.
{ 123: "abc" }
{ "123": "abc" }
Khóa Bị Trùng Lặp
Mặc dù được phép theo chuẩn JSON, các khóa trùng lặp thường là nguyên nhân phổ biến gây lỗi.
{ "name": "Alice", "name": "Bob" }
Hầu hết các trình phân tích cú pháp chỉ giữ lại giá trị cuối cùng ("Bob"), tự động bỏ qua các giá trị trước đó.
Sử dụng Bình luận
JSON chuẩn không cho phép chú thích, mặc dù một số trình soạn thảo có hỗ trợ chúng.
{ // Thông tin người dùng "name": "Alice" }
{ "name": "Alice" }
Xác Thực Schema: Áp Dụng Cấu Trúc và Kiểu Dữ Liệu Chính Xác
JSON Schema là một tiêu chuẩn mạnh mẽ để định nghĩa và xác thực cấu trúc dự kiến của các tài liệu JSON. Nó cho phép bạn chỉ định:
- Các trường bắt buộc (`required`)
- Kiểu dữ liệu (`type`: chuỗi, số, boolean, đối tượng, mảng, null)
- Định dạng chuỗi (`format`: email, uuid, ngày-giờ, v.v.)
- Khớp mẫu cho chuỗi (`pattern`)
- Phạm vi số (`tối thiểu`, `tối đa`)
- Kiểm tra độ dài mảng và phần tử (`minItems`, `maxItems`, `items`)
- Xác thực lồng nhau cho đối tượng và mảng
- Ràng buộc liệt kê (`enum`)
Ví dụ: Định nghĩa Người dùng (Draft-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 }
Điều này thi hành:
- id phải là chuỗi UUID hợp lệ.
- tên phải là chuỗi không được để trống.
- email phải đúng định dạng email tiêu chuẩn.
- is_active (tùy chọn) phải là một giá trị boolean.
- Không được phép sử dụng các thuộc tính ngoài những thuộc tính đã được định nghĩa ở trên.
Ví Dụ Thực Tế: Xác Thực Phản Hồi API Stripe
Giả sử bạn nhận được các phản hồi JSON từ API Stripe (ví dụ: PaymentIntent). Việc xác thực cấu trúc (schema validation) giúp bạn đảm bảo không bao giờ xử lý dữ liệu thiếu hoặc có kiểu không đúng.
{ "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": [ "yêu_cầu_phương_thức_thanh_toán", "yêu_cầu_xác_nhận", "đang_xử_lý", "thành_công", "đã_hủy" ]} }, "required": ["id", "object", "amount", "currency", "status"], "additionalProperties": false }
- id phải bắt đầu bằng "pi_"
- đối tượng phải luôn là "payment_intent"
- số lượng phải là một số nguyên lớn hơn hoặc bằng 1
- tiền tệ phải là chuỗi gồm ba chữ cái (ví dụ: "usd", "eur")
- trạng thái phải là một trong các giá trị được chỉ định
Lợi ích
- Phát hiện lỗi sớm: Phát hiện kịp thời các thay đổi API gây lỗi hoặc dữ liệu không đầy đủ trước khi chúng ảnh hưởng đến logic kinh doanh của bạn.
- Kiểm thử Tự động: Sử dụng schema trong pipeline CI/CD để xác thực phản hồi thực và giả lập.
- Đồng bộ đa nhóm: Chuẩn hóa hợp đồng dữ liệu giữa frontend, backend và API bên thứ ba.
Xác thực JSON đúng chuẩn—bao gồm cả cú pháp và cấu trúc—giúp ngăn chặn lỗi tinh vi, áp dụng các thực hành tốt nhất và bảo vệ ứng dụng của bạn khỏi đầu vào bị sai định dạng hoặc độc hại. Dù sử dụng trong file cấu hình, dữ liệu API hay truyền thông giữa các dịch vụ, việc xác thực mạnh mẽ là nền tảng thiết yếu cho hệ thống phần mềm hiện đại.
Quyền riêng tư & An ninh
Mọi kiểm tra xác thực và cấu trúc schema đều được thực hiện trực tiếp trên trình duyệt của bạn. Không có dữ liệu nào được tải lên hay ghi lại. Định dạng JSON của bạn luôn được bảo mật tuyệt đối.
Ví dụ mã nguồn cho xác thực JSON
Tìm hiểu cách xác thực JSON trong nhiều ngôn ngữ lập trình khác nhau bằng cách sử dụng thư viện tích hợp sẵn hoặc các framework phổ biến. Những ví dụ này minh họa cả việc xác thực cú pháp và xác thực theo schema, giúp bạn đảm bảo dữ liệu JSON chính xác và đáng tin cậy.
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)
}
}
Về công cụ này
Công cụ này được phát triển bởi đội ngũ tại Itself Tools, những người sáng tạo ra nhiều tiện ích trực tuyến nhanh, ưu tiên bảo mật, được hàng triệu người dùng trên toàn cầu tin dùng. Với nhiều năm kinh nghiệm xây dựng các công cụ trên trình duyệt ưu tiên sự đơn giản, tốc độ và độ tin cậy, chúng tôi đã mở rộng sang các ứng dụng dành cho nhà phát triển như công cụ này—được thiết kế để giúp các lập trình viên, nhà phân tích và chuyên gia kỹ thuật số thực hiện các nhiệm vụ kỹ thuật một cách dễ dàng hơn.