Công cụ dành cho nhà phát triển · JSON trình định dạng và xác thực
Cách JSON in ấn đẹp mắt hoạt động: thụt lề, khoảng trắng và thứ tự khóa
· Cách thức hoạt động
json developer-workflow xác nhận
Những bản in đẹp chỉ thay đổi khoảng trắng không đáng kể, nhưng mọi người lo lắng nó sẽ làm thay đổi dữ liệu của họ. Bài đăng này giải thích những gì trình định dạng được phép chạm vào, độ sâu thụt lề được áp dụng như thế nào và điều gì xảy ra với thứ tự phím.
Cùng một dữ liệu, ba giao diện khác nhau
Cùng một dữ liệu, ba giao diện khác nhau — tải trọng API nhỏ gọn có thể chiếm một dòng, mở rộng với hai khoảng trắng ở mỗi độ sâu hoặc trải rộng hơn với bốn khoảng trắng. Dấu ngoặc nhọn, dấu ngoặc đơn, tên và giá trị mô tả cấu trúc được phân tích cú pháp giống nhau trong mọi phiên bản. Chỉ có ngắt dòng và khoảng cách giữa các mã thông báo cấu trúc là khác nhau. Sự khác biệt đó rất quan trọng khi xem xét đầu ra của bộ định dạng: độ khác biệt lớn hơn không tự động thay đổi dữ liệu, vì việc thụt lề có chủ ý thay đổi nhiều byte trong khi vẫn giữ nguyên giá trị kết quả.
ToolAcre cung cấp hai, bốn hoặc tám khoảng trắng và một tab, sau đó chuyển thụt lề đã chọn tới JSON.stringify. Một bản ghi triển khai lồng nhau ngắn giúp so sánh rõ ràng: các vùng vẫn giữ nguyên thứ tự mảng, boolean vẫn giữ nguyên boolean và số lần thử vẫn là số.
Khoảng trắng nào JSON được coi là không đáng kể
Khoảng trắng nào JSON được coi là không đáng kể — RFC 8259 cho phép khoảng trắng, tab ngang, nguồn cấp dữ liệu dòng và trả về đầu dòng trước hoặc sau các ký tự cấu trúc. Do đó, trình định dạng có thể đặt một dòng mới sau `{`, dấu cách trước thành viên lồng nhau và một dòng mới khác trước `}` mà không thay đổi giá trị. Tuy nhiên, khoảng trắng không phải là thứ dùng một lần phổ biến. Khi dấu ngoặc kép mở ra một chuỗi, mọi khoảng trắng thông thường đều thuộc về nội dung của chuỗi đó và phải tồn tại ở định dạng chính xác như dữ liệu.
Mô hình tinh thần an toàn nhất là tách ranh giới mã thông báo khỏi nội dung chuỗi. Giữa dấu hai chấm và số, khoảng trắng được phép bổ sung được thể hiện. Giữa các chữ cái của một tin nhắn được trích dẫn là thông tin. ToolAcre trước tiên phân tích cú pháp nguồn và tuần tự hóa giá trị kết quả, vì vậy JSON.stringify chọn khoảng trắng mới xung quanh vùng chứa trong khi vẫn giữ nguyên các ký tự chuỗi được giải mã.
Cách áp dụng cài đặt thụt lề
Cách áp dụng cài đặt thụt lề — mỗi vùng chứa lồng nhau sẽ thêm một bản sao của đơn vị thụt lề đã chọn. Thuộc tính cấp cao nhất bắt đầu một cấp trong; một thuộc tính bên trong đối tượng của nó bắt đầu ở hai cấp độ; một đối tượng bên trong một mảng sẽ thêm một cấp độ khác. Dấu ngoặc nhọn và dấu ngoặc đóng sẽ quay trở lại phần thụt lề của vùng chứa sở hữu chúng. Do đó, chiều rộng phản ánh chiều sâu cấu trúc hơn là chiều dài của khóa, giá trị hoặc dòng trước đó.
Các khoảng trắng tạo ra chiều rộng hình ảnh cố định trong mọi trình chỉnh sửa, trong khi một tab cho phép mỗi người xem chọn độ rộng hiển thị của một cấp độ. JavaScript cũng giới hạn JSON.stringify thụt lề ở mười ký tự khoảng trắng hoặc mười ký tự đầu tiên của chuỗi được cung cấp, mặc dù ToolAcre chỉ hiển thị các cài đặt trước thực tế.
Định dạng có thay đổi thứ tự phím không?
Định dạng có thay đổi thứ tự phím không? — in đẹp thông thường không cố ý sắp xếp các thành viên đối tượng. Các đối tượng JSON về mặt khái niệm là các bộ sưu tập không có thứ tự, nhưng việc phân tích cú pháp và tuần tự hóa JavaScript sử dụng các quy tắc liệt kê thuộc tính đã xác định. Do đó, hầu hết các khóa không phải số nguyên đều xuất hiện theo thứ tự đầu vào của chúng, trong khi các khóa giống số nguyên có thể được hiển thị trước các tên khác. Người tiêu dùng không bao giờ nên gắn ý nghĩa kinh doanh vào vị trí thành viên, ngay cả khi người định dạng xuất hiện để duy trì nó một cách nhất quán cho các đối tượng quen thuộc.
ToolAcre tách thụt lề khỏi sắp xếp. Khi tính năng sắp xếp bị vô hiệu hóa, nó sẽ tuần tự hóa trực tiếp đối tượng được phân tích cú pháp. Khi bật tính năng sắp xếp, nó sẽ xây dựng đệ quy các đối tượng có khóa được sắp xếp theo thứ tự bảng chữ cái trước khi JSON.stringify chạy; mảng giữ nguyên thứ tự phần tử của chúng vì việc sắp xếp lại mảng sẽ thay đổi ý nghĩa của nó. Tùy chọn rõ ràng này tạo ra sự khác biệt có thể xem xét: đầu ra chỉ có khoảng trắng đến từ bản in đẹp, trong khi sự khác biệt về thứ tự khóa đến từ việc yêu cầu tổ chức chuẩn.
Trình định dạng phân tích cú pháp và sắp xếp lại có thể thay đổi những gì
Trình định dạng phân tích cú pháp và sắp xếp lại có thể thay đổi những gì - giá trị được phân tích cú pháp vẫn tồn tại, nhưng chính tả ban đầu của nó thì không. Một số được viết là `1.0` có thể trả về là `1` và `1e3` có thể trả về là `1000`. Một ký tự thoát có thể in được có thể xuất hiện lại theo nghĩa đen, trong khi một ký tự chữ có thể được thoát khi quá trình tuần tự hóa yêu cầu nó. Tên đối tượng trùng lặp đã được thu gọn trong quá trình phân tích cú pháp, do đó, chỉ giá trị thuộc tính cuối cùng vẫn có sẵn cho trình định dạng.
Những chuyển đổi này giải thích tại sao đầu ra được định dạng không nên được coi là trình soạn thảo tài liệu bảo toàn byte. So sánh các giá trị được phân tích cú pháp khi mục tiêu là tương đương về ngữ nghĩa và kiểm tra các khác biệt về văn bản khi ký hiệu ban đầu quan trọng đối với quy trình ký, băm hoặc kiểm tra. Các số nguyên rất lớn cần được quan tâm đặc biệt vì các số JavaScript có thể mất độ chính xác trước khi tuần tự hóa.
Ví dụ hoạt động: định dạng một đối tượng lồng nhau
Ví dụ hoạt động: định dạng một đối tượng lồng nhau — bắt đầu bằng `{"service":{"regions":["sg","us"],"retry":{"count":3}}}` và chọn hai khoảng trắng. Dấu ngoặc nhọn mở đầu được theo sau bởi một dòng mới. `service` nhận được hai khoảng trắng ở đầu, thuộc tính con của nó nhận được bốn, các phần tử mảng nhận được sáu và thuộc tính `count` lồng nhau cũng nhận được sáu. Mỗi dấu phẩy kết thúc một thành viên được hiển thị và mỗi dấu phân cách đóng sẽ căn chỉnh với mức thụt lề của vùng chứa mở.
Việc chuyển cùng một giá trị sang một tab chỉ thay đổi tiền tố được sử dụng cho mỗi cấp độ. Ngoài ra, việc bật sắp xếp khóa có thể đặt `regions` trước `retry`, nhưng mảng vẫn đọc `sg` rồi `us`. Quá trình xem xét hữu ích sẽ kiểm tra kết quả đầu ra theo hai bước: trước tiên hãy xác nhận rằng thứ tự lồng và thứ tự mảng thể hiện giá trị ban đầu, sau đó quyết định xem khoảng trắng đã chọn có phù hợp với kho lưu trữ hay không.
Điều này không bao gồm những gì
Điều này không bao gồm - sắp xếp khóa là một lựa chọn chuẩn hóa riêng biệt và rút gọn là thao tác trình bày ngược lại. Tính năng in đẹp cũng không bao giờ cấp quyền sắp xếp lại các mảng: vị trí mảng là dữ liệu, vì vậy việc thay đổi nó có thể làm thay đổi mức độ ưu tiên, trình tự thời gian hoặc hành vi của chương trình. Việc thụt lề cũng không làm cho nguồn không hợp lệ trở thành hợp lệ trước khi phân tích cú pháp. Nhận xét, dấu phẩy ở cuối và giá trị chỉ JavaScript phải được trình phân tích cú pháp sửa hoặc xử lý đối với định dạng thực tế của chúng trước khi trình định dạng JSON nghiêm ngặt có thể tuần tự hóa chúng.
Lược đồ JSON chuẩn mực còn tiến xa hơn định dạng thông thường bằng cách xác định chính xác thứ tự thành viên, đánh vần số và thoát để lấy chữ ký hoặc hàm băm xác định. ToolAcre không tuyên bố sẽ triển khai tiêu chuẩn chuẩn hóa như vậy. Nó tạo ra đầu ra cục bộ của trình duyệt có thể đọc được bằng cách sử dụng JSON.parse và JSON.stringify, với tính năng sắp xếp khóa đệ quy tùy chọn.
Bài học rút ra: in ấn đẹp là một sự chuyển đổi khoảng trắng
Bài học rút ra: in đẹp là một phép biến đổi khoảng trắng - mục đích của nó là hiển thị cấu trúc mà không thay đổi giá trị được biểu thị. Độ rộng thụt lề ảnh hưởng đến khả năng đọc, tiếng ồn khi đánh giá và quy ước cục bộ chứ không ảnh hưởng đến tính hợp lệ của JSON. Khoảng trắng bên trong chuỗi vẫn là dữ liệu, thứ tự mảng vẫn có ý nghĩa quan trọng và việc sắp xếp khóa đối tượng yêu cầu một lựa chọn rõ ràng riêng biệt. Việc ghi nhớ những ranh giới đó giúp đánh giá sự khác biệt về định dạng dễ dàng hơn và ngăn ngừa những thay đổi về mặt thẩm mỹ khỏi bị nhầm lẫn với các chỉnh sửa ngữ nghĩa.
Công cụ phân tích cú pháp và sắp xếp lại vẫn có thể chuẩn hóa số và thoát cách viết vì nó hoạt động từ giá trị chứ không phải văn bản mã thông báo gốc. Hãy xem lại những trường hợp khi độ trung thực từ vựng đóng vai trò quan trọng và tránh sử dụng kết quả đầu ra đẹp đẽ thông thường làm hình thức chuẩn cho chữ ký. Đối với cấu hình hàng ngày và kiểm tra API, hãy chọn thụt lề mà nhóm của bạn sử dụng, loại bỏ việc sắp xếp trừ khi muốn, định dạng cục bộ và xác thực văn bản được phát ra.