JSON obsługuje następujące struktury danych (odpowiedniki Java): Skalarne, Tablica / Lista i Mapa.
A Set
nie jest obsługiwany po wyjęciu z pudełka w JSON.
Pomyślałem o kilku sposobach przedstawienia zestawu w JSON:
[1] - Jako lista
Jednak lista ma własną kolejność, więc następujących dwóch list, ["a", "b"]
a ["b", "a"]
nie są równe jak list, ale powinny one być równe jak zestawy.
[2] - Jako mapa
Użyj zestawu kluczy mapy i zignoruj wartości.
Ale znowu, używając standardowego porównania, te dwa nie są takie same jak mapy:
{"a": "foo", "b": "bar"}
, {"a": null, "b": null}
[3] - Jako mapa o specjalnej wartości
Weź skalar, powiedz 0
lub null
i zmuś, aby był wartością każdego klucza na mapie:
{"a": 0, "b": 0}
W ten sposób, zgodnie ze standardowymi narzędziami porównywania, obiekty są równe, nawet po zmianie kolejności kluczy.
Jednak ta technika zanieczyszcza dokument JSON nieistotnymi danymi.
[4] - Jako lista uporządkowana
Wróć do pierwszej sugestii, ale tym razem jako uporządkowanej listy. Ten rodzaj rozwiązuje problem porównania.
Należy jednak pamiętać o złożoności sortowania, a także, że notacja mapy obsługuje duplikaty, podczas gdy sortowana lista nie. Przykład:
{"a": 400, "a": 9}
jest traktowane jako {"a": 9}
, ale ["g", "g"]
zawsze tak będzie ["g", "g"]
.
Powiedziawszy to wszystko, wydaje mi się, że notacja na liście jest wyraźniejsza, ale notacja mapy jest bardziej odporna na powielanie kluczy i utrudnia spójność w odniesieniu do specjalnej wartości (chociaż null
wydaje się to dobrym wyborem).
Co myślisz? Jak reprezentowałbyś zestaw w JSON?
PS
Zauważ, że pytanie dotyczy wyłącznie JSON. Wiem, że inne formaty, takie jak yaml, są dostępne. Nadal...