JSON hỗ trợ các cấu trúc dữ liệu sau (tương đương Java): Vô hướng, Mảng / Danh sách và Bản đồ.
A Set
không được hỗ trợ ngoài hộp trong JSON.
Tôi đã nghĩ về một số cách để biểu diễn một tập hợp trong JSON:
[1] - Như một danh sách
Tuy nhiên, một danh sách có thứ tự riêng của nó, vì vậy hai danh sách sau đây ["a", "b"]
và ["b", "a"]
không bằng danh sách, nhưng chúng phải bằng nhau như bộ.
[2] - Như một bản đồ
Sử dụng bộ khóa của bản đồ và bỏ qua các giá trị.
Nhưng một lần nữa, bằng cách sử dụng so sánh tiêu chuẩn, cả hai không giống như bản đồ:
{"a": "foo", "b": "bar"}
, {"a": null, "b": null}
[3] - Là bản đồ, có giá trị đặc biệt
Lấy một vô hướng, nói 0
hoặc null
và buộc nó là giá trị của mọi khóa trong bản đồ:
{"a": 0, "b": 0}
Bằng cách này, dưới các công cụ so sánh tiêu chuẩn, các đối tượng bằng nhau, ngay cả khi thứ tự khóa được thay đổi.
Tuy nhiên, kỹ thuật này gây ô nhiễm tài liệu JSON với dữ liệu không liên quan.
[4] - Như một danh sách được sắp xếp
Quay lại đề xuất đầu tiên, nhưng lần này là một danh sách theo thứ tự. Loại này giải quyết vấn đề so sánh.
Tuy nhiên, chúng ta cũng nên ghi nhớ sự phức tạp của việc sắp xếp và ký hiệu bản đồ đó xử lý các bản sao, trong khi một danh sách được sắp xếp thì không. Thí dụ:
{"a": 400, "a": 9}
được xử lý như {"a": 9}
, nhưng ["g", "g"]
sẽ luôn luôn như vậy ["g", "g"]
.
Tôi đã nói tất cả những điều đó, dường như ký hiệu danh sách rõ ràng hơn, nhưng ký hiệu bản đồ mạnh hơn đối với sao chép khóa và khiến cho việc thống nhất về giá trị đặc biệt khó khăn hơn (mặc dù null
có vẻ như là một lựa chọn tốt cho điều đó).
Bạn nghĩ sao? Làm thế nào bạn sẽ đại diện cho một bộ trong JSON?
PS
Lưu ý rằng câu hỏi này chỉ đơn thuần là về JSON. Tôi biết rằng các định dạng khác, như yaml, có sẵn. Vẫn...