Tất cả bài viết

JSON Sort Keys: vì sao cần sắp xếp khóa của object

Đặc tả JSON không quy định chính thức thứ tự các khóa trong một object — {"a": 1, "b": 2}{"b": 2, "a": 1} đại diện cho cùng một dữ liệu. Nhưng trong thực tế, thứ tự khóa vẫn thường quan trọng, cả với con người lẫn với các công cụ làm việc với dữ liệu đó.

Vì sao cần sắp xếp khóa

  • So sánh (diff). Nếu hai tài liệu JSON có cùng dữ liệu nhưng thứ tự khóa khác nhau, một diff văn bản sẽ báo sai lệch giả. Sắp xếp loại bỏ vấn đề này.
  • Đầu ra xác định. Nếu cùng một object được tuần tự hóa nhiều lần (ví dụ để tạo hash hoặc khóa cache), các khóa đã sắp xếp đảm bảo kết quả giống nhau mỗi lần.
  • Khả năng đọc. Một object được sắp xếp theo bảng chữ cái dễ dàng lướt qua và tìm một trường cụ thể hơn, đặc biệt trong các cấu trúc lớn.

Sắp xếp đệ quy

Để kết quả có thể dự đoán được, việc sắp xếp thường được áp dụng đệ quy — không chỉ với các khóa cấp cao nhất, mà còn với khóa của mọi object lồng nhau ở bất kỳ độ sâu nào. Thứ tự các phần tử trong mảng không thay đổi, vì với mảng, thứ tự phần tử là một phần có ý nghĩa của dữ liệu.

Khi nào không cần thiết

Nếu JSON chỉ được một chương trình sử dụng (không phải con người hay công cụ diff), việc sắp xếp khóa thường không mang lại lợi ích thực tế nào — trình phân tích cú pháp đọc một object giống nhau bất kể thứ tự trường.

Sắp xếp tiếng Việt phức tạp hơn hầu hết ngôn ngữ khác vì có hai lớp dấu

Việc sắp xếp theo bảng chữ cái tiếng Việt phải tính đến hai lớp dấu riêng biệt: dấu phụ gắn với nguyên âm để tạo nguyên âm mới (ví dụ â, ă, ê, ô, ơ, ư — về bản chất là chữ cái khác, không chỉ là biến thể), và dấu thanh điệu chồng lên trên (sắc, huyền, hỏi, ngã, nặng) chỉ ảnh hưởng đến cách phát âm chứ không đổi chữ cái. Sắp xếp đúng chuẩn tiếng Việt so sánh theo chữ cái gốc trước, sau đó mới đến dấu thanh — ví dụ "la", "là", "lá", "lả", "lã", "lạ" nằm cạnh nhau — trong khi so sánh code point Unicode ngây thơ hoàn toàn không hiểu hai lớp phân biệt này và sẽ xáo trộn thứ tự đó.

Sắp xếp và locale

Việc sắp xếp theo bảng chữ cái đối với các khóa không chỉ chứa ký tự Latin phụ thuộc vào việc so sánh được thực hiện theo từng byte (Unicode code point) hay có tính đến quy tắc ngôn ngữ (locale-aware collation). Ví dụ, so sánh theo code point đặt chữ hoa trước chữ thường bất kể bảng chữ cái nào, trong khi sắp xếp có tính đến locale có thể sắp xếp khóa theo thứ tự khác.

Dùng thử công cụ