Как сохранить ключевые слова в массивах при конвертации в 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, или вы делаете что-то неудачное, например, прикрепляете какие-либо метаданные к объекту, указывающие, что является ключевым словом, а что нет.

Вы также можете просто отказаться от идеи ключевых слов и использовать строки для всего внутри. Это будет отстой, но, по крайней мере, это облегчит взаимодействие.

Другие вопросы по тегам