Як зобразити набір у JSON?


16

JSON підтримує такі структури даних (еквіваленти Java): Scalar, Array / List і Map.

A Setв JSON не підтримується поза вікном.

Я подумав про кілька способів представити набір у JSON:

[1] - Як список

Однак у списку є своє впорядкування, тому наступні два списки ["a", "b"]і ["b", "a"]не рівні як списки, але вони повинні бути рівними як множини.

[2] - Як карта

Використовуйте набір ключів на карті та ігноруйте значення.

Але знову ж таки, використовуючи стандартне порівняння, вони не є такими, як карти:

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[3] - Як карта, що має особливе значення

Візьміть скаляр, скажіть 0або nullпримусьте його бути значенням кожного ключа на карті:

{"a": 0, "b": 0}

Таким чином, у стандартних інструментах порівняння об'єкти рівні, навіть якщо ключове впорядкування змінюється.

Однак ця методика забруднює документ JSON неактуальними даними.

[4] - Як упорядкований список

Повернення до першої пропозиції, але цього разу як упорядкований список. Цей вид вирішує питання порівняння.

Однак слід також пам’ятати про складність сортування, а також те, що позначення карти обробляє дублікати, тоді як відсортований список цього не робить. Приклад:

{"a": 400, "a": 9}обробляється як {"a": 9}, але ["g", "g"]завжди було б ["g", "g"].

Сказавши все це, мені здається, що позначення списку чіткіше, але позначення на карті є більш надійними для дублювання клавіш і ускладнюють послідовність щодо спеціального значення (навіть якщо це nullздається хорошим вибором для цього).

Як ти гадаєш? Як би ви представляли набір в JSON?

PS

Зауважте, що питання стосується лише JSON. Я знаю, що доступні й інші формати, наприклад, yaml. Все-таки ...


1
Набори не підтримуються JSON, це виходить за межі сфери. Набір або окрема унікальна колекція існує в межах програми. Оскільки це колекція, було б очевиднішим використовувати синтаксис колекції.
Зимус

1
Чому ви хочете представляти набори в JSON? Пам'ятайте, JSON - формат обміну.
Андрес Ф.

@AndresF. Я подумав, що було б непоганою ідеєю висловити унікальний атрибут цінностей. Я б не прив’язував JSON лише до формату обміну. Він також може бути корисним для зберігання документів (наприклад, у MongoDB).
Рон Кляйн

@RonKlein Ярмарок досить. Але так ... не запускайте мене з MongoDB: P
Андрес Ф.

У YAML набори представлені як ваш варіант [3], але він має особливі позначення, яких JSON не має.
Ясмійн

Відповіді:


21

Ну, ти не можеш. Як ви сказали, ви можете представляти масиви та словники. У вас є два варіанти.

Представити набір як масив. Перевага: Перетворення з набору в масив і назад зазвичай просте. Недолік: Масив має на увазі порядок, якого набір не робить, тому перетворення однакових наборів у масиви JSON може створювати масиви, які вважатимуться різними. Немає можливості застосувати, що елементи масиву є унікальними, тому масив JSON може не містити дійсного набору (очевидно, ви можете просто проігнорувати дублікати; саме це, швидше за все, станеться).

Представляйте набір як словник з довільним значенням на ключ, наприклад 0 або null. Якщо ви просто ігноруєте значення, це ідеальна відповідність. З іншого боку, у вас може бути відсутність бібліотечної підтримки для вилучення ключів словника як набору або для перетворення набору в словник.

У моєму середовищі програмування перетворення між набором і масивом простіше (встановити масив втратить дублікати значень, яких або не повинно бути там, або вважатимуться правильними), тому з цієї причини я б пішов з масивами. Але це дуже питання питання.

АЛЕ: У кімнаті великий жирний слон, про який не згадували. Клавішами в словнику JSON можуть бути лише рядки. Якщо ваш набір не є набором рядків, то у вас є лише вибір використання масиву.


5
крайній край рядків - це гарний аргумент проти словника.
Рон Кляйн

4

Не намагайтеся представляти набори в JSON. Зробіть це під час аналізу даних замість цього.

Ваші дані JSON повинні мати схему, яка визначає, які поля слід розглядати як набір, або у вас можуть бути метадані, вбудовані в самі дані JSON, яка описує, коли список слід трактувати як набір (наприклад {"houses": {"_type": "set", "value": [...]}}) або з умовами іменування.

Зауважте, що відповідно до стандарту JSON, об'єкт JSON може мати повторювані ключі. Формулювання ECMA-404:

Об'єкти

[...] Синтаксис JSON не накладає жодних обмежень на рядки, що використовуються як імена, не вимагає, щоб рядки імен були унікальними, і не надавали жодного значення упорядкуванню імен / значень пар. Це все семантичні міркування, які можуть бути визначені процесорами JSON або в специфікаціях, що визначають конкретні можливості використання JSON для обміну даними.

AFAICD, нічого в специфікації забороняє не унікальні імена, і існує багато реалізацій розбору JSON, які можуть розбирати не унікальні імена об'єктів. RFC 7159 відмовляє від унікальних імен для інтероперабельності, але спеціально також не забороняє цього, і продовжує перелічити, як бачили різні парсери, що обробляють не унікальні імена об’єктів.

І ECMA 404 також не вимагає збереження впорядкування масиву:

Масиви

Синтаксис JSON не визначає конкретного значення для впорядкування значень. Однак структура масиву JSON часто використовується в ситуаціях, коли є певна семантика впорядкування.

Це формулювання дозволяє програмам використовувати масиви для представлення наборів, якщо вони захочуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.