Công cụ dành cho nhà phát triển · JSON trình định dạng và xác thực
JSON giải thích về thoát chuỗi: \n, \uXXXX và các ký tự điều khiển
· Cách thức hoạt động
json developer-workflow xác nhận
Dòng mới thô bên trong chuỗi JSON không hợp lệ và tab cũng vậy. Bài đăng này đề cập đến tám chuỗi thoát, cách hoạt động của các cặp thoát \u và thay thế cũng như lý do tại sao một đoạn được dán có thể làm mất hiệu lực toàn bộ tệp.
Đoạn đã phá vỡ tải trọng
Đoạn đã phá vỡ trọng tải — việc dán dấu ngắt dòng hiển thị vào phần mô tả được trích dẫn sẽ chèn ký tự điều khiển trực tiếp vào chuỗi JSON. Dòng đầu tiên có vẻ hoàn chỉnh nhưng trích dẫn mở đầu vẫn mong đợi nội dung chuỗi hoặc trích dẫn kết thúc. Khi trình phân tích cú pháp tiếp cận nguồn cấp dữ liệu dòng thô, nó sẽ dừng ở đó vì các chuỗi JSON không thể mở rộng các dòng vật lý theo cách đó. Văn bản phải chứa ký tự thoát gồm hai ký tự `\n` ở bất cứ nơi nào giá trị được giải mã cần dòng mới.
Các tab được sao chép từ tài liệu hoặc bảng tính đều gây ra lỗi tương tự, mặc dù trình chỉnh sửa có thể hiển thị chúng dưới dạng khoảng cách vô hại. Thay thế một tab bằng chữ bằng `\t`, trả về đầu dòng bằng `\r` và các điều khiển bị cấm khác bằng các ký tự thoát được đặt tên hoặc Unicode của chúng.
Tám lối thoát JSON cho phép
Tám ký tự thoát JSON cho phép — sau dấu gạch chéo ngược, các dạng rút gọn là `"`, `\\`, `\/`, `\b`, `\f`, `\n`, `\r` và `\t`. Chúng đại diện cho dấu ngoặc kép, dấu gạch chéo ngược, dấu gạch chéo, dấu lùi, nguồn cấp dữ liệu biểu mẫu, nguồn cấp dữ liệu dòng, dấu xuống dòng và tab ngang. Dấu gạch chéo cũng có thể xuất hiện không thoát; `\/` tồn tại chủ yếu để tương thích với các ngữ cảnh đã từng xử lý đặc biệt chuỗi tập lệnh đóng.
Không có chữ cái nào khác có thể theo sau dấu gạch chéo ngược JSON. Các chuỗi quen thuộc trong các ngôn ngữ lập trình, chẳng hạn như `\v`, `\0`, `\x41` hoặc dấu gạch chéo ngược theo sau là dòng mới vật lý, đều không hợp lệ ở đây. Sử dụng `\u` theo sau là chính xác bốn chữ số thập lục phân khi không có lối thoát ngắn. Từ vựng cố định nhỏ này giúp các chuỗi JSON có tính di động: người tiêu dùng không cần các quy tắc thoát JavaScript, Python hoặc shell cụ thể để xác định các ký tự được biểu thị bằng văn bản hợp lệ.
Tại sao tab theo nghĩa đen không hợp lệ nhưng é theo nghĩa đen lại được
Tại sao tab theo nghĩa đen không hợp lệ nhưng é theo nghĩa đen lại được — JSON cấm các điểm mã không thoát từ U+0000 đến U+001F bên trong chuỗi. Phạm vi đó chứa các tab, dòng mới và các điều khiển khác mà hiệu ứng vô hình của chúng có thể làm gián đoạn việc đóng khung hoặc hiển thị. Chữ cái `é` là U+00E9, nằm ngoài phạm vi kiểm soát, vì vậy UTF-8 JSON có thể bao gồm nó trực tiếp giữa các dấu ngoặc kép. Điều này cũng đúng với hầu hết các chữ viết, biểu tượng và biểu tượng cảm xúc.
Do đó, việc thoát khỏi Unicode thông thường là tùy chọn, không phải là yêu cầu về độ sạch sẽ. `"café"` và `"caf\u00e9"` giải mã thành cùng một chuỗi ký tự. Văn bản trực tiếp thường dễ đọc hơn đối với mọi người, trong khi các lối thoát có thể giúp truyền tải chỉ ASCII hoặc hiển thị một đơn vị mã cụ thể. Các ký tự điều khiển thì khác: việc thoát của chúng là bắt buộc.
Cách thoát \uXXXX hoạt động
Cách hoạt động của lối thoát `\uXXXX` — `u` phải được theo sau bởi chính xác bốn chữ số thập lục phân, sử dụng 0–9 hoặc A–F trong cả hai trường hợp. `\u00E9` đại diện cho đơn vị mã UTF-16 cho `é` và `\u000A` đại diện cho nguồn cấp dữ liệu dòng. Ít chữ số hơn, dấu ngoặc nhọn như `\u{1F600}` hoặc chữ cái không phải thập lục phân làm cho JSON không hợp lệ, ngay cả khi ngôn ngữ lập trình khác chấp nhận ký hiệu đó.
Các ký tự ở trên U+FFFF được thể hiện ở dạng thoát này dưới dạng cặp thay thế. Biểu tượng cảm xúc 😀 có thể được viết là `\uD83D\uDE00`: đại diện thay thế cao và thấp kết hợp sau khi phân tích cú pháp thành một giá trị vô hướng Unicode. Ngữ pháp JSON có thể mang một lối thoát thay thế không ghép đôi, nhưng các bộ mã hóa và ứng dụng xuôi dòng có thể từ chối hoặc thay thế nó vì nó không xác định được ký tự Unicode hoàn chỉnh.
Ví dụ đã hoạt động: thoát khỏi đường dẫn Windows và đoạn mã HTML
Ví dụ đã hoạt động: thoát khỏi đường dẫn Windows và đoạn mã HTML — đường dẫn dự định `C:\Temp\report.txt` cần mỗi dấu gạch chéo ngược được nhân đôi trong nguồn JSON: `"C:\\Temp\\report.txt"`. Nếu không tăng gấp đôi, `\T` là lối thoát không hợp lệ và các chuỗi như `\r` hoặc `\t` có thể âm thầm trở thành ký tự điều khiển thay vì dấu phân cách đường dẫn. Xây dựng JSON từ giá trị mong muốn, không phải bằng cách đoán dấu gạch chéo được hiển thị nào đã thuộc về ngôn ngữ bên ngoài.
Một đoạn HTML chẳng hạn như `<a title="Report">Open</a>` có thể giữ nguyên dấu ngoặc nhọn và dấu gạch chéo theo nghĩa đen, nhưng dấu ngoặc kép thuộc tính phải trở thành `\"` bên trong chuỗi JSON. Nếu dòng mới phân tách hai thẻ, hãy mã hóa nó thành `\n`. Thành viên JSON thu được có thể được xác thực và phân tích cú pháp trở lại văn bản HTML ban đầu.
Nơi trốn thoát được nhân đôi
Khi số lần thoát tăng gấp đôi - mọi ngữ pháp văn bản kèm theo đều có cơ hội diễn giải dấu gạch chéo ngược. Tài liệu JSON chứa chuỗi được giải mã `line1\nline2` phải thoát khỏi dấu gạch chéo ngược đó, tạo ra `"line1\\nline2"`. Nếu văn bản JSON đó được lưu trữ dưới dạng chuỗi JSON thì dấu ngoặc kép và cả dấu gạch chéo ngược của nó cần một lớp thoát khác. Sự lộn xộn rõ ràng ghi lại nhiều cách biểu diễn chứ không phải dạng mở rộng đặc biệt của JSON.
Các shell và các ký tự trong ngôn ngữ lập trình thêm các quy tắc trích dẫn của riêng chúng trước khi trình phân tích cú pháp JSON nhìn thấy đối số. Chẩn đoán từ trong ra ngoài: trước tiên hãy viết giá trị được giải mã chính xác, mã hóa thành JSON một lần, sau đó mã hóa văn bản JSON hoàn chỉnh đó cho shell hoặc ngôn ngữ nguồn xung quanh. Tại mỗi ranh giới, hãy kiểm tra byte hoặc ký tự mà trình phân tích cú pháp tiếp theo thực sự nhận được.
Điều này không bao gồm những gì
Điều này không bao gồm những gì — HTML các thực thể như `"` và URL mã hóa phần trăm chẳng hạn như `%20` là các phép biến đổi riêng biệt cho các ngữ cảnh cú pháp riêng biệt. Trình phân tích cú pháp JSON không giải mã được cả hai dạng. Chuỗi `"""` chứa sáu ký tự bằng chữ sau khi phân tích cú pháp, không phải dấu ngoặc kép và `"%20"` chứa dấu phần trăm, theo sau là hai chữ số, không phải dấu cách. Chỉ áp dụng các mã hóa đó khi dữ liệu chuyển sang thành phần HTML hoặc URL.
Cuộc thảo luận này cũng không thay thế mã hóa đầu ra. JSON hợp lệ nhận được từ nguồn không đáng tin cậy vẫn có thể chứa HTML, văn bản giống tập lệnh hoặc chuỗi điều khiển đầu cuối dưới dạng dữ liệu chuỗi thông thường. Ứng dụng sau này hiển thị hoặc thực thi lệnh phải xử lý đích đó một cách an toàn. Việc thoát JSON bảo vệ cấu trúc JSON; nó không phải là sự khử trùng phổ quát.
Takeaway: thoát khỏi những gì ngữ pháp cấm, không có gì hơn
Bài học rút ra: thoát khỏi những gì ngữ pháp cấm, không gì hơn — dấu ngoặc kép, dấu gạch chéo ngược và điểm mã bên dưới U+0020 cần chú ý bên trong chuỗi JSON. Unicode thông thường vẫn có thể đọc được, trong khi `\uXXXX` cung cấp cặp thay thế và thay thế chính xác có bốn chữ số đại diện cho các ký tự phía trên U+FFFF. Chẩn đoán ở vị trí dường như trống thường xác định dòng mới theo nghĩa đen, tab hoặc ký tự điều khiển khác phải được thay thế bằng ký tự thoát văn bản của nó.
Đếm các lớp mã hóa thay vì đếm dấu gạch chéo bằng mắt. Bắt đầu từ giá trị mà ứng dụng sẽ nhận được, mã hóa nó một lần cho JSON và chỉ sau đó trích dẫn tài liệu kết quả cho bất kỳ shell bên ngoài, tệp nguồn hoặc chuỗi JSON thứ hai nào. Xác thực văn bản được trình bày cho trình phân tích cú pháp JSON và khi độ chính xác quan trọng, hãy kiểm tra chuỗi được giải mã sau đó.