Как сохранить ключевые слова в массивах при конвертации в json с помощью js->clj?
Мое реальное поведение
(js->clj (clj->js [:a :b :c]) :keywordize-keys true)
=> ["a" "b" "c"]
Желаемое поведение
[:a :b :c]
1 ответ
Я не использую ClojureScript, но следует отметить, что :keywordize-keys
ничего не делает, потому что векторы индексируются по индексу. Элементами вектора являются значения, а не индексы.
Вы могли бы сделать что-то вроде
(->> [:a :b :c]
(clj->js)
(js->clj)
(mapv keyword))
; Should print [:a :b :c]
Конечно, это становится немного сложнее, если структура вложенная, но это та же самая общая идея.
Поскольку JSON не распознает концепцию "ключевого слова", не существует простого способа преобразования между двумя форматами и поддержания того, что является строкой и что является ключевым словом. Если вам действительно нужно провести различие, вы можете использовать формат EDN Clojure вместо JSON. Это будет работать только в том случае, если вы не выполняете чрезмерное взаимодействие с JavaScript. Любые данные, которыми обмениваются с простой библиотекой JS, будут включать в себя сочетание ключевых слов и строк, если библиотека не понимает форматирование EDN, или вы делаете что-то неудачное, например, прикрепляете какие-либо метаданные к объекту, указывающие, что является ключевым словом, а что нет.
Вы также можете просто отказаться от идеи ключевых слов и использовать строки для всего внутри. Это будет отстой, но, по крайней мере, это облегчит взаимодействие.