Tiếng Việt

Công cụ dành cho nhà phát triển · JSON trình định dạng và xác thực

Toàn bộ ngữ pháp JSON trên một trang: sáu loại giá trị, hai vùng chứa

· Lý lịch

json tiêu chuẩn xác nhận

Toàn bộ ngữ pháp JSON trên một trang: sáu loại giá trị, hai vùng chứa được minh họa bằng mã thông báo JSON và ranh giới xác thực chính xác
Hình minh họa vector ToolAcre gốc

Toàn bộ ngữ pháp của JSON nằm gọn trên một trang và việc thuộc lòng nó sẽ giúp mọi lỗi của trình xác thực trở nên rõ ràng. Bài đăng này trình bày về sáu loại giá trị, hai vùng chứa và một số quy tắc khiến mọi người gặp khó khăn.

Mọi lỗi bạn từng thấy đều xuất phát từ một trang

Mọi lỗi cú pháp đều là sự vi phạm kỳ vọng trong một ngữ pháp cô đọng. Sau khi một đối tượng mở ra, trình phân tích cú pháp sẽ yêu cầu tên thành viên được trích dẫn hoặc dấu ngoặc nhọn đóng; sau một cái tên, nó mong đợi một dấu hai chấm; sau một giá trị, nó sẽ có dấu phẩy hoặc phần cuối của vùng chứa. Đọc lỗi khi quá trình chuyển đổi không thành công sẽ hữu ích hơn việc coi ký tự được báo cáo là bí ẩn.

ToolAcre chấp nhận các giá trị JSON tiêu chuẩn và khoảng trắng, sau đó áp dụng hai giới hạn đầu vào thực tế. Văn bản dài hơn 8,000,000 ký tự bị từ chối trước khi phân tích cú pháp và trình quét lồng bên ngoài vùng chứa 512 bị từ chối thay vì duyệt qua vô thời hạn. Đó là ranh giới của sản phẩm, không phải loại JSON mới. Trong đó, chẩn đoán xác định điểm đầu tiên mà luồng mã thông báo không còn đáp ứng ngữ pháp nữa.

Sáu giá trị — đối tượng, mảng, chuỗi, số, true/false và null, và thực tế là không có gì khác

Giá trị JSON là một đối tượng, mảng, chuỗi, số, boolean hoặc null. Các đối tượng và mảng có thể chứa bất kỳ đối tượng nào trong số sáu đối tượng, bao gồm nhiều vùng chứa hơn. Cách viết chính xác là `true`, `false` và `null`; viết hoa không linh hoạt. Các mã thông báo như `True`, `None`, `undefined`, `NaN` và `Infinity` nằm ngoài mức nghiêm ngặt JSON ngay cả khi một ngôn ngữ khác nhận ra một số mã thông báo đó.

Danh sách ngắn này làm cho việc phân loại trở thành một kỹ thuật sửa lỗi hữu ích. Trong `{"reading": NaN}`, dấu hai chấm giới thiệu chính xác một giá trị nhưng `N` không thể bắt đầu bất kỳ giá trị được phép nào. Chỉ thay thế nó sau khi quyết định ý nghĩa của dữ liệu, có thể là `null` hoặc trạng thái được trích dẫn. Công cụ cú pháp có thể từ chối mã thông báo; nó không thể chọn ứng dụng thay thế hoặc quyết định xem trường đó có thuộc về ứng dụng đó hay không.

Các đối tượng và mảng — các thành phần được phân tách bằng dấu phẩy, dấu hai chấm và lý do RFC 8259 để lại thứ tự và tên trùng lặp cho quá trình triển khai

Các đối tượng chứa tên được phân tách bằng dấu phẩy/value thành viên. Mỗi tên là một chuỗi trích dẫn kép, theo sau là dấu hai chấm và một giá trị. Mảng chứa các giá trị được phân tách bằng dấu phẩy, không có tên hoặc dấu hai chấm. Các vùng chứa `{}` và `[]` trống là hợp lệ nhưng dấu phẩy không được dẫn đầu, theo sau hoặc xuất hiện hai lần. Việc khớp từng dấu phân cách với vùng chứa của nó sẽ nhanh chóng phát hiện ra nhiều lỗi “mã thông báo không mong muốn” rõ ràng.

Tên đối tượng phải là duy nhất nhưng cách viết trùng lặp không bị trình xác thực này từ chối. `{"port": 80, "port": 443}` phân tích cú pháp và `JSON.parse` giữ lại giá trị sau này. Sau đó, định dạng chỉ phát ra thành viên còn sót lại đó, do đó văn bản trước đó không thể khôi phục được từ kết quả. Các vị trí mảng hoạt động khác nhau: mọi phần tử vẫn hiện diện và thứ tự của nó là một phần của giá trị.

Chuỗi và số chính xác

Chuỗi sử dụng dấu ngoặc kép. Dấu gạch chéo ngược có thể đưa ra dấu trích dẫn, dấu gạch chéo ngược, dấu gạch chéo, `b`, `f`, `n`, `r`, `t` hoặc thoát Unicode bốn chữ số; ký tự điều khiển thô bị cấm. Dấu ngoặc đơn là các mã thông báo không hợp lệ thông thường bên ngoài một chuỗi. Các quy tắc này giải thích lý do tại sao các chữ JavaScript được sao chép và văn bản nhiều dòng được dán có thể trông có thể đọc được trong khi không thực hiện xác thực JSON nghiêm ngặt.

Một số có thể có dấu trừ, phần nguyên, phân số tùy chọn và số mũ tùy chọn. Nó không thể bắt đầu bằng `+`, sử dụng ký hiệu thập lục phân, mang số 0 đứng đầu trước một chữ số khác hoặc đánh vần một giá trị không hữu hạn. `-0.25e+2` hợp lệ; `01`, `.5`, `2.` và `Infinity` thì không. Quá trình phân tích cú pháp sẽ kiểm tra ngữ pháp, chứ không phải liệu JavaScript có thể bảo toàn chính xác từng chữ số hay không.

Khoảng trắng và cấp cao nhất

Các chuỗi bên ngoài, khoảng trắng JSON được giới hạn ở khoảng trắng, tab ngang, nguồn cấp dữ liệu và trả về đầu dòng. Một khoảng trắng không ngắt được sao chép từ một trang web không thể thay thế được với một khoảng trắng thông thường. Định dạng có thể tự do lựa chọn trong số các khoảng trắng được phép xung quanh mã thông báo, nhưng nó phải giữ nguyên khoảng trắng nằm trong chuỗi trích dẫn vì các ký tự đó là dữ liệu.

Tài liệu hoàn chỉnh có thể là bất kỳ giá trị JSON nào, không chỉ là một đối tượng hoặc mảng. `42`, `false` và `"ready"` là các văn bản cấp cao nhất hợp lệ. Điều bị cấm là giá trị thứ hai sau giá trị đầu tiên: `42 43` là hai tài liệu chứ không phải một. Sự khác biệt này giải thích tại sao JSON được phân tách bằng dòng mới yêu cầu xử lý theo từng bản ghi thay vì một phân tích cú pháp thông thường của toàn bộ tệp.

Ví dụ hoạt động: phân tích tài liệu nhỏ bằng tay

Lấy `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. Đối tượng gốc bắt đầu một thành viên có tên `order`; giá trị của nó là một mảng chứa một số, null và một đối tượng khác. Sau đó, dấu phẩy giới thiệu `note`, có giá trị là một chuỗi có dòng mới thoát. Mỗi dấu hai chấm, dấu phẩy và dấu phân cách đóng đều có một vai trò ngữ pháp.

Bây giờ hãy xóa trích dẫn trước `paid`. Sau dấu ngoặc nhọn lồng nhau, trình phân tích cú pháp cần có dấu ngoặc nhọn đóng hoặc tên được trích dẫn, do đó, nó không thành công ở `p`. Ngoài ra, hãy thêm dấu phẩy sau `true`; trình phân tích cú pháp chấp nhận dấu phẩy và sau đó thất bại ở `}` vì thành viên khác phải tuân theo. Việc dự đoán các vị trí đó bằng tay sẽ biến việc xác thực thành xác nhận và không khuyến khích việc chỉnh sửa dấu câu ngẫu nhiên.

Điều này không bao gồm những gì

Ngữ pháp không có ngày, số thập phân, số nhị phân, UUID hoặc loại thời lượng. Các ứng dụng thường biểu diễn các khái niệm đó bằng chuỗi hoặc số và áp đặt các quy ước riêng biệt. Dấu thời gian có thể là chuỗi JSON hoàn toàn hợp lệ trong khi chứa ngày không thể chấp nhận được. Tương tự như vậy, một đối tượng hợp lệ về mặt cú pháp có thể bỏ qua các thuộc tính bắt buộc hoặc sử dụng sai đơn vị mà không vi phạm một quy tắc phân tích cú pháp nào.

ToolAcre không thực hiện kiểm tra lược đồ, xác thực tên miền hoặc chuẩn hóa. Nó cũng không diễn giải lại các tính năng JSON5 hoặc JSONC như nhận xét và dấu phẩy ở cuối. Công việc của nó hẹp hơn: chấp nhận một văn bản JSON nghiêm ngặt trong giới hạn sản phẩm, định dạng giá trị được phân tích cú pháp và xác định lỗi cú pháp. Giữ các câu hỏi sau về hình dạng và ý nghĩa trong lớp xác thực của ứng dụng tiêu dùng.

Bài học rút ra: ghi nhớ ngữ pháp, tin tưởng vào vị trí

Danh sách kiểm tra lâu bền rất ngắn: sáu danh mục giá trị, tên đối tượng được trích dẫn, chỉ dấu phẩy giữa các mục, chỉ dấu hai chấm giữa tên và giá trị, thoát chuỗi nghiêm ngặt, chính tả số nghiêm ngặt, bốn ký tự khoảng trắng và chính xác một giá trị cấp cao nhất. Khi một tài liệu bị lỗi, hãy xác định những gì ngữ pháp được phép ngay trước vị trí được báo cáo và so sánh kỳ vọng đó với ký tự thực sự có mặt.

Tin tưởng vào vị trí là điểm bất khả thi đầu tiên, không phải lúc nào cũng là nhân vật cần xóa. Dấu ngoặc đóng có thể được đánh dấu vì dấu phẩy trước đó hứa hẹn với thành viên khác; một lá thư vô tội có thể được đánh dấu vì thiếu trích dẫn mở đầu. Sửa chữa nguyên nhân, chạy lại xác nhận và lặp lại. Đối với đầu vào quá khổ hoặc cực sâu, hãy giải quyết ranh giới sản phẩm có độ sâu 8 triệu ký tự hoặc 512 trước khi chẩn đoán cú pháp có thể trợ giúp.