JSON Tool
Kiểm tra, format và khám phá JSON ngay trong trình duyệt. Dán hoặc tải JSON lên để phát hiện lỗi cú pháp tức thì, rồi xem dưới dạng code tô màu cú pháp, cây (tree) tương tác, bảng (table) hoặc dạng nén (compact) một dòng. Mọi xử lý diễn ra cục bộ trong trình duyệt nên dữ liệu của bạn không rời khỏi thiết bị.
Các bước sử dụng
- Nhập JSON: nhấn Dán để dán từ clipboard, dùng Tải lên để tải file
.jsonhoặc.txt, hoặc gõ trực tiếp vào ô JSON đầu vào (có số dòng và tô màu cú pháp trực tiếp). - Theo dõi thẻ trạng thái cạnh thanh công cụ: thẻ xanh Hợp lệ nghĩa là JSON hợp lệ, còn thẻ đỏ Lỗi - Dòng chỉ đến lỗi đầu tiên. Thanh báo lỗi và số dòng được tô sáng cho biết chính xác dòng, cột và nội dung lỗi.
- Làm gọn bằng Định dạng (in đẹp với thụt lề 2 dấu cách) hoặc Rút gọn (nén về một dòng). Cả hai chỉ hoạt động khi JSON đã hợp lệ.
- Đổi cách hiển thị kết quả bằng thanh chọn: Code (dòng tô màu, có số dòng), Viewer (cây có thể mở rộng, hiện số phần tử và nút copy từng nhánh), Table (hàng và cột cho mảng các object), Rút gọn (văn bản đã nén), Truy vấn (chạy biểu thức trên dữ liệu), So sánh (đối chiếu với một tài liệu thứ hai), Patch hoặc JSON Schema (kiểm tra theo schema hoặc tự tạo schema).
- Ở chế độ Viewer, dùng nút mở/thu gọn tất cả hoặc bấm vào từng nút để đi sâu vào, và di chuột lên một giá trị để copy riêng nhánh đó.
- Xuất kết quả bằng Sao chép để đưa văn bản thô vào clipboard, hoặc Tải xuống để lưu thành file
data.json.
Truy vấn — lấy dữ liệu bằng biểu thức
Chuyển tab hiển thị sang Truy vấn, gõ biểu thức rồi nhấn Chạy (hoặc phím Enter). Truy vấn dùng JSONata — một ngôn ngữ truy vấn dành riêng cho JSON — và chạy hoàn toàn trong trình duyệt của bạn.
Một ô truy vấn trống thì vô dụng với người chưa từng biết cú pháp, nên ngay bên dưới ô nhập có một hàng thẻ ví dụ: bấm vào một thẻ để nạp biểu thức rồi sửa lại theo ý bạn. $ là toàn bộ tài liệu, $keys($) liệt kê tên các khoá cấp ngoài cùng, **.name gom mọi giá trị name ở mọi cấp, còn $sum(**.price) cộng tất cả price tìm được.
Kết quả hiển thị dạng JSON đã format. Sao chép đưa kết quả vào clipboard, còn Dùng làm đầu vào thay nội dung ô soạn thảo bằng kết quả để bạn nối tiếp một truy vấn nữa. Biểu thức không khớp dữ liệu nào sẽ được báo rõ chứ không hiện kết quả rỗng, còn lỗi cú pháp hay lỗi khi tính toán sẽ hiện kèm thông báo gốc của JSONata.
So sánh hai file JSON
Chuyển tab hiển thị sang So sánh rồi dán tài liệu thứ hai vào ô JSON B. Bạn nhận được phép so sánh theo cấu trúc chứ không phải so sánh văn bản từng dòng:
+thêm mới — khoá hoặc phần tử mảng chỉ có ở B.-bị xoá — chỉ có ở A.~thay đổi — cùng đường dẫn nhưng khác giá trị (hoặc khác kiểu dữ liệu).⇅đổi vị trí — vẫn là phần tử đó nhưng nằm ở chỉ số khác. Cột B cho biết nó chuyển tới đâu.
Mỗi dòng hiện đúng đường dẫn ($.user.roles[2]) kèm giá trị ở cả hai bên, nên việc đảo thứ tự khoá hay thụt lề khác nhau không bao giờ bị báo nhầm là khác biệt.
Phép so sánh dựa trên ngữ nghĩa chứ không dựa trên văn bản. Thứ tự khoá bị bỏ qua ở mọi cấp, và các phần tử mảng được ghép theo giá trị trước khi ghép theo vị trí: so một mảng với chính nó đã bị xáo trộn chỉ cho ra vài dòng "đổi vị trí" thay vì báo mọi ô đều thay đổi. Những phần tử còn dư ở cả hai bên sẽ được ghép cặp và so từng trường, nên một thuộc tính bị sửa bên trong phần tử danh sách được báo đúng tại đường dẫn của nó ($.items[3].price) chứ không bị coi là xoá đi rồi thêm lại.
Patch — JSON Patch và Merge Patch
Chuyển tab hiển thị sang Patch. Hai công tắc quyết định việc cần làm:
- Tạo patch A → B sinh một patch biến tài liệu trong ô soạn thảo (A) thành tài liệu bạn dán bên dưới (B). Áp patch vào A nhận một tài liệu patch và hiện kết quả sau khi áp vào A; Dùng làm đầu vào đưa kết quả đó vào ô soạn thảo.
- JSON Patch (RFC 6902) là danh sách thao tác (
add,remove,replace,move,copy,test) trỏ tới vị trí bằng JSON Pointer như/items/2/price. Merge Patch (RFC 7386) là một tài liệu bộ phận: key có mặt sẽ được gán, key mang giá trịnullsẽ bị xoá, còn mảng bị thay nguyên khối.
Áp dụng JSON Patch theo kiểu được ăn cả ngã về không: nếu một thao tác lỗi thì không có gì thay đổi, và thông báo lỗi nêu số thứ tự thao tác kèm op và đường dẫn — ví dụ "Thao tác #3 (replace /user/age): path "/user/age" does not exist". Thao tác test không khớp cũng báo lỗi như vậy, đó là cách một patch tự bảo vệ để không bị áp nhầm phiên bản.
JSON Patch sinh ra luôn áp ngược lại đúng thành B. Với mảng, phần đầu và phần cuối giống nhau được giữ nguyên và phần giữa được sửa tại chỗ, nên thêm một phần tử vào cuối chỉ là một thao tác add. Merge Patch sinh ra không diễn tả được "gán key này bằng null", vì null nghĩa là xoá — trang sẽ cảnh báo khi B có những giá trị null như vậy; hãy dùng JSON Patch cho các tài liệu đó.
Biến đổi — dọn cấu trúc
Menu Biến đổi trên thanh công cụ ghi đè nội dung ô soạn thảo:
- Xoá giá trị null bỏ mọi thành phần và phần tử mảng là
null, ở mọi cấp. - Xoá giá trị rỗng bỏ thêm
"",[]và{}— xử lý từ dưới lên, nên object trở nên rỗng sau khi dọn cũng bị bỏ.0vàfalseđược giữ lại. - Làm phẳng thành đường dẫn chấm biến
{"a": {"b": [1, 2]}}thành{"a.b.0": 1, "a.b.1": 2}— dạng mà bảng tính và nhiều hệ thống cấu hình cần. - Dựng lại từ đường dẫn chấm làm ngược lại: các đoạn số
0, 1, 2…trở lại thành mảng. Key vốn đã chứa dấu chấm thì không khôi phục chính xác được.
JSON Schema — kiểm tra, tạo schema, soát lỗi, dữ liệu mẫu
Chuyển tab hiển thị sang JSON Schema. Thanh chọn thứ hai quyết định việc cần làm:
- Kiểm tra dữ liệu đối chiếu JSON trong ô soạn thảo với schema bạn dán vào ô bên dưới — nhấn Kiểm tra. Phiên bản được chọn theo
$schemacủa schema: hỗ trợ 2020-12, 2019-09 và draft-07; schema không có$schemađược kiểm tra theo 2020-12, còn schema draft-04/06 được kiểm tra theo quy tắc draft-07. Mọi lỗi được liệt kê cùng lúc, gồm đường dẫn dữ liệu (/items/2/price), thông báo dễ hiểu, từ khoá bị vi phạm (required,type,format…) và đường dẫn trong schema, còn tổng số lỗi nằm trong thẻ đỏ. Ô soạn thảo tô sáng những dòng chứa giá trị bị lỗi. Các định dạng nhưemail,uri,date-time,uuidvàipv4được kiểm tra thật chứ không chỉ để làm ghi chú. - Cảnh báo chế độ strict — từ khoá không xác định như
minLenghtgõ nhầm, hayminimumđặt cho chuỗi — được liệt kê riêng trong khung vàng. Chúng không làm dữ liệu bị coi là sai, nhưng thường cho thấy schema không nói đúng điều bạn nghĩ. - Tạo schema suy ra schema 2020-12 từ JSON trong ô soạn thảo: kiểu dữ liệu,
required(một key chỉ bắt buộc khi có mặt trong mọi phần tử của mảng), trường có thể null viết dạng["string", "null"], và object lồng nhau được viết trực tiếp. Hai công tắc bổ sungformatđoán được và danh sáchenumcho nhóm chuỗi ít giá trị, lặp lại. Dùng làm schema chuyển kết quả vào ô schema và mở Kiểm tra dữ liệu để bạn kiểm tra ngay mẫu dữ liệu với nó. - Soát lỗi schema kiểm tra chính schema: vi phạm meta-schema của phiên bản (ví dụ
"type": "strng"), tham chiếu không phân giải được và từ khoá không xác định. Nhấn Soát schema. - Dữ liệu mẫu tạo một tài liệu thoả mãn schema. Công cụ ưu tiên
const,default,examplesvàenum, sau đó điền giá trị giữ chỗ theo từng kiểu, có tôn trọngminLength,minItems,minimum,required,$refvàallOf. Gồm cả thuộc tính không bắt buộc quyết định có điền các trường không bắt buộc hay không, còn Dùng làm đầu vào đưa dữ liệu mẫu vào ô soạn thảo.
Bộ kiểm tra (ajv) chỉ được tải về ở lần đầu bạn nhấn Kiểm tra hoặc Soát schema, và dữ liệu của bạn không rời khỏi trình duyệt.
Mẹo
- Bấm nút bánh răng (Màu sắc) để tùy chỉnh màu cú pháp cho key, string, number, boolean, null và dấu ngoặc; nhấn Reset để trở về mặc định.
- Chế độ Table phù hợp nhất với mảng các object — nó tạo một cột cho mỗi key trên tất cả phần tử và phân trang 50 hàng mỗi lần. Với object đơn, bảng hiển thị theo Key / Type / Value.
- Nhấn Tab trong ô nhập để chèn hai dấu cách mà không mất con trỏ, giúp bạn tự chỉnh thụt lề.
- Chú ý phần thống kê trên thanh công cụ (dung lượng, số dòng, số object/array/key và độ sâu) để ước lượng JSON lớn hay lồng sâu tới đâu.
- Ở chế độ Truy vấn, bạn có thể nhấn Enter ngay trong ô biểu thức thay vì rê chuột tới nút Chạy.
- Dùng Sắp xếp khoá trước khi So sánh nếu muốn hai tài liệu nhìn giống nhau khi đặt cạnh nhau — bản thân phép so sánh vốn đã bỏ qua thứ tự khoá, nên việc này chỉ để dễ nhìn.
Câu hỏi thường gặp
JSON của tôi có được tải lên máy chủ không?
Không. Việc kiểm tra, format và mọi chế độ xem đều chạy hoàn toàn phía trình duyệt, nên không có gì được gửi đi đâu cả.
Vì sao Định dạng và Rút gọn bị vô hiệu hoặc báo lỗi?
Chúng chỉ chạy với JSON hợp lệ. Nếu thấy "Sửa lỗi trước", hãy xem thẻ lỗi đỏ và dòng được tô sáng, sửa cú pháp rồi thử lại.
Vì sao kết quả so sánh báo "đổi vị trí" chứ không phải "thay đổi"?
Vì bản thân phần tử đó không đổi, chỉ có vị trí trong mảng là khác. Công cụ ghép các phần tử mảng theo giá trị trước, nên một danh sách bị đảo thứ tự sẽ cho ra các dòng đổi vị trí. Nếu phần tử vừa bị chuyển chỗ vừa bị sửa, bạn sẽ thấy cả hai: một dòng đổi vị trí và một dòng thay đổi tại đúng đường dẫn của trường bị sửa.
Truy vấn của tôi không trả về gì. Vậy có phải lỗi không?
Không. JSONata không trả về giá trị nào khi biểu thức không khớp dữ liệu, và trường hợp đó được báo là "không khớp" chứ không phải lỗi. Sai sót thật sự — gõ nhầm biểu thức, hoặc phép tính không áp dụng được cho dữ liệu của bạn — sẽ hiện thành thông báo lỗi màu đỏ kèm nội dung gốc từ JSONata.
Đây là ngôn ngữ truy vấn nào? Tôi dùng JSONPath được không?
Đây là JSONata, không phải JSONPath. Với đường dẫn đơn giản thì hai bên khá giống nhau (a.b.c chạy được ở cả hai) nhưng khác hẳn khi bắt đầu lọc hoặc tổng hợp. JSONata là một ngôn ngữ biểu thức đầy đủ nên còn làm được phép tính, sắp xếp, ánh xạ và các hàm như $sum, $count, $keys, $sort.
Table báo cần object — vì sao bảng trống?
Table được thiết kế cho object và mảng các object. Một chuỗi, số, hay mảng các giá trị nguyên thủy ở cấp cao nhất thì không có cột để hiển thị, nên hãy dùng chế độ Code hoặc Viewer cho những trường hợp đó.
Vì sao kiểm tra theo schema vẫn qua dù schema có lỗi chính tả?
JSON Schema bỏ qua những từ khoá nó không biết, nên requried hay minLenght gõ nhầm không ràng buộc gì cả. Trang liệt kê các từ khoá đó thành cảnh báo chế độ strict ngay dưới kết quả, và Soát lỗi schema hiển thị riêng chúng.
Schema được tạo ra có luôn chấp nhận mẫu dữ liệu gốc không?
Có. Một key chỉ bắt buộc khi mọi phần tử mảng đều có nó, định dạng chỉ được đoán khi mọi giá trị đều khớp, và object lồng nhau được viết trực tiếp, nên hai object khác nhau tình cờ trùng tên key không bao giờ bị gộp thành một. Hãy coi đó là điểm khởi đầu và tự siết thêm bằng minimum, pattern hay additionalProperties: false.