Dữ liệu JSON (.json)

RFC Tiêu chuẩn

JavaScript Object Notation (JSON) là định dạng văn bản nhẹ, dễ đọc đối với con người để trao đổi dữ liệu, hoàn toàn độc lập với ngôn ngữ và được dùng phổ biến trên toàn cầu cho các API web.

Chuyển đổi JSON sang HTML

Trình chuyển đổi từ JSON sang HTML miễn phí trên trình duyệt. Chuyển đổi tệp ngay lập tức trên thiết bị của bạn.

Nén JSON trực tuyến

Riêng tư - tệp không bao giờ rời khỏi thiết bị của bạn

Kiểm tra & Siêu dữ liệu

Các hệ điều hành và trình phân tích tệp nhận dạng tệp JSON bằng cách kiểm tra chuỗi byte nhị phân đầu tệp:

Chọn hoặc thả tệp vào đây

Riêng tư - tệp không bao giờ rời khỏi thiết bị của bạn

Hoặc dán Ctrl+V
Cam kết bảo vệ quyền riêng tư, không truyền dữ liệu qua mạng: 0 byte được tải lên máy chủ bên ngoài. Toàn bộ quá trình xử lý diễn ra cục bộ trong hộp cát trình duyệt của bạn.

Chữ ký ở đầu tệp (mẫu byte nhận diện)

Các hệ điều hành và trình phân tích tệp nhận dạng tệp JSON bằng cách kiểm tra chuỗi byte nhị phân đầu tệp:

CHỮ KÝ HEX (OFFSET 0):

7B or 5B

BIỂU DIỄN ASCII: { or [

Tiêu chuẩn hóa: RFC 8259 / ECMA-404 / ISO/IEC 21778

Thông số kỹ thuật

Kiến trúc ContainerĐịnh dạng trao đổi dữ liệu nhẹ, dạng văn bản, độc lập ngôn ngữ
NénNén văn bản Gzip / Brotli / Zstandard (thường đạt tỷ lệ 80%-90%)
Thứ tự byteUnicode mã hóa UTF-8 (khuyến nghị không sử dụng Byte Order Mark / BOM)
Không gian màuKhông áp dụng
Kênh & Cấu trúcSáu kiểu dữ liệu cơ bản: đối tượng (object), mảng (array), chuỗi (string), số (number), giá trị luận lý (boolean), giá trị rỗng (null)
Kích thước tối đaKhông giới hạn; chỉ bị giới hạn bởi bộ nhớ của trình phân tích cú pháp và chiều dài chuỗi tối đa
Độ trong suốtKhông áp dụng
Truyền phát & Tăng dầnNDJSON (Newline Delimited JSON) / JSON Lines cho phép xử lý luồng tăng dần

Ma trận so sánh kỹ thuật: JSON so với các đối thủ

Thuộc tính kỹ thuậtJSON (Hiện tại)YAMLXMLProtocol Buffers
Độ phức tạp cú phápTối thiểu (6 kiểu, cú pháp nghiêm ngặt)Cao (dựa trên thụt lề, đặc tả phức tạp)Cao (thẻ đóng dài dòng, không gian tên)Định dạng truyền dẫn nhị phân xác định bằng lược đồ
Hiệu suất phân tích cú phápCực kỳ nhanh trong mọi ngôn ngữ hiện đạiChậm (phân tích cú pháp thụt lề phức tạp)Trung bình đến chậm (xây dựng DOM nặng)Cực nhanh (giải tuần tự hóa nhị phân không sao chép)
Hỗ trợ chú thíchKhông (cố ý loại bỏ để ngăn chặn sự phình to của siêu dữ liệu)Có (chú thích #)Có (chú thích <!-- -->)Có trong các tệp .proto
Kích thước tải trọng mạngVăn bản gọn nhẹ (tỷ lệ gzip rất cao)Văn bản gọn nhẹVăn bản dài dòng (lặp lại thẻ nặng)Nhị phân cực kỳ gọn nhẹ

Các dạng hỏng thường gặp và hướng dẫn khôi phục bằng mã hex

SyntaxError: Gặp dấu phẩy không mong đợi trong JSON tại vị trí X.

Nguyên nhân gốc rễ: Dấu phẩy thừa sau mục cuối cùng trong mảng hoặc đối tượng, điều này hoàn toàn không hợp lệ trong JSON theo chuẩn RFC 8259.

Khắc phục: Loại bỏ các dấu phẩy thừa khỏi khóa đối tượng và phần tử mảng trước khi truyền vào hàm JSON.parse().

SyntaxError: Gặp ký tự ' không mong đợi trong JSON.

Nguyên nhân gốc rễ: Chuỗi hoặc khóa được đặt trong dấu ngoặc đơn ('') thay vì dấu ngoặc kép ("").

Khắc phục: Thay thế tất cả các chuỗi và khóa nằm trong dấu ngoặc đơn bằng chuỗi tiêu chuẩn nằm trong dấu ngoặc kép.

Phân tích bảo mật và các đường tấn công nhằm vào bộ phân tích cú pháp

JSON chỉ là văn bản và an toàn trước việc thực thi mã trực tiếp, nhưng việc phân tích cú pháp JSON không đáng tin cậy có thể dẫn đến Ô nhiễm Nguyên mẫu (Prototype Pollution), ReDoS hoặc cạn kiệt bộ nhớ.

Các véc-tơ tấn công đã biết

  • Ô nhiễm Nguyên mẫu (Prototype Pollution): Các khóa có tên '__proto__' hoặc 'constructor' sửa đổi Object.prototype trong các ứng dụng JavaScript.
  • Tấn công từ chối dịch vụ bằng cách làm tràn ngăn xếp thông qua các cấu trúc JSON lồng nhau sâu (ví dụ: 10.000 dấu ngoặc mở).
  • Mất độ chính xác của số: Các số JavaScript lớn hơn 2^53 - 1 (9,007,199,254,740,991) sẽ âm thầm mất độ chính xác.

Biện pháp phòng thủ tốt nhất: Không bao giờ đánh giá JSON bằng hàm eval(). Sử dụng JSON.parse() và làm sạch các thuộc tính '__proto__' trong các hàm hợp nhất đối tượng đệ quy.

Nguồn gốc lịch sử và các cột mốc

2017RFC 8259 chuẩn hóa UTF-8 làm mã hóa ký tự bắt buộc duy nhất cho JSON.
2013ECMA-404 định nghĩa cú pháp JSON, được nhiều ngôn ngữ lập trình và nền tảng sử dụng.
2001Douglas Crockford quy định JSON để cho phép giao tiếp dữ liệu phi trạng thái từ trình duyệt đến máy chủ.

Ưu điểm & Lợi ích chính

  • Cấu trúc văn bản dễ đọc đối với con người, tự mô tả và ngắn gọn.
  • Hỗ trợ phân tích cú pháp gốc được tích hợp sẵn trong các công cụ JavaScript (JSON.parse) và mọi ngôn ngữ lập trình lớn.
  • Đặc tả nghiêm ngặt ngăn chặn việc thực thi mã tùy ý.

Hạn chế & Nhược điểm kỹ thuật

  • Không hỗ trợ chú thích, dấu phẩy thừa ở cuối, hoặc tham chiếu đối tượng vòng lặp.
  • Không có kiểu dữ liệu nhị phân gốc (dữ liệu nhị phân phải được mã hóa base64, làm tăng kích thước lên 33%).
  • Tuần tự hóa kém hiệu quả hơn so với các định dạng nhị phân như Protocol Buffers hoặc MessagePack.

Thông tin kỹ thuật thú vị

  • Douglas Crockford đã thêm điều khoản giấy phép phần mềm 'Phần mềm phải được sử dụng vì điều tốt, không phải vì điều xấu' vào các công cụ JSMin JSON ban đầu.
  • JSON là một tập con nghiêm ngặt của cú pháp JavaScript, nhưng cho đến phiên bản ES2019, các ký tự U+2028 và U+2029 thô chưa được thoát là hợp lệ trong JSON nhưng không hợp lệ trong chuỗi JavaScript.
  • Douglas Crockford phát hiện ra rằng các trình duyệt web đời đầu có thể đánh giá JSON trực tiếp thành các đối tượng bằng hàm eval() gốc của JavaScript trước khi các API JSON.parse() chuyên dụng được chuẩn hóa trong ECMAScript 5.

Các câu hỏi kỹ thuật thường gặp

Tại sao JSON không cho phép chú thích?

Ngữ pháp JSON không cho phép chú thích. Các cách triển khai có thể xử lý phần mở rộng và dữ liệu riêng của ứng dụng khác nhau, nên riêng định dạng này không đảm bảo khả năng tương tác.

Làm cách nào để lưu trữ số nguyên 64-bit trong JSON mà không bị mất độ chính xác?

Kiểu Number gốc của JavaScript là số thực dấu phẩy động độ chính xác kép IEEE 754, chỉ hỗ trợ chính xác các số nguyên lên đến 2^53 - 1. Các số nguyên 64-bit (như ID cơ sở dữ liệu hoặc dấu thời gian) phải được tuần tự hóa dưới dạng chuỗi (ví dụ: '1234567890123456789') trong JSON.

Sự khác biệt giữa JSON và NDJSON / JSON Lines là gì?

JSON tiêu chuẩn đóng gói toàn bộ dữ liệu trong một đối tượng hoặc mảng gốc duy nhất, yêu cầu trình phân tích cú pháp phải tải toàn bộ văn bản trước khi đánh giá. NDJSON (Newline Delimited JSON) tách rời từng bản ghi JSON hợp lệ bằng các ký tự xuống dòng (\n), cho phép phát trực tuyến từng dòng tiết kiệm bộ nhớ đối với các tập dữ liệu lớn nhiều gigabyte.

Các cặp chuyển đổi JSON liên quan

JSON sang HTML

Việc chuyển đổi dữ liệu JSON thành mã nguồn HTML giúp biến các cặp khóa-giá trị có cấu trúc thô thành tài liệu web dễ đọc, sẵn sàng cho trình duyệt kết xuất.

HTML sang JSON

Việc chuyển đổi mã nguồn HTML thành dữ liệu JSON giúp biến các tài liệu web dễ đọc thành các cặp khóa-giá trị có cấu trúc để xử lý bằng chương trình và đưa vào API.

SQL sang JSON

Chuyển tập lệnh SQL dạng văn bản thành dữ liệu JSON để biến các bảng cơ sở dữ liệu quan hệ cố định thành đối tượng lồng nhau linh hoạt cho ứng dụng web hiện đại.

JSON sang SQLITE

Chuyển tệp văn bản JSON phi cấu trúc thành cơ sở dữ liệu quan hệ SQLite có cấu trúc để lập chỉ mục nhanh và truy vấn tập dữ liệu lớn.

ASE sang JSON

Chuyển tệp Adobe Swatch Exchange sang cấu trúc JSON màu, biến bảng màu thiết kế dạng nhị phân thành các đối tượng văn bản dễ đọc cho ứng dụng web hiện đại.

JSON sang ASE

Chuyển dữ liệu JSON màu dạng văn bản thành mẫu màu Adobe ASE dạng nhị phân, kết nối mã thông báo thiết kế trên web với các ứng dụng dàn trang chuyên nghiệp trên máy tính.

GPL sang JSON

Chuyển tệp văn bản bảng màu GIMP sang cấu trúc JSON màu để ứng dụng web đọc trực tiếp các mẫu màu mà không cần tập lệnh phân tích cú pháp phức tạp.

JSON sang CSS

Chuyển tệp JSON màu có cấu trúc thành biến CSS, biến đối tượng dữ liệu thô thành thuộc tính định kiểu gốc cho trang web.