Как сохранить ключевые слова в массивах при конвертации в json с помощью js-> clj? - PullRequest
0 голосов
/ 29 ноября 2018

Мое реальное поведение

(js->clj (clj->js [:a :b :c]) :keywordize-keys true)
=> ["a" "b" "c"]

Желаемое поведение

[:a :b :c]

1 Ответ

0 голосов
/ 29 ноября 2018

Я не использую ClojureScript, но следует заметить, что :keywordize-keys не делает ничего вероятного, потому что векторы кодируются по индексу.Элементами вектора являются значения, а не индексы.

Вы можете сделать что-то вроде

(->> [:a :b :c]
     (clj->js)
     (js->clj)
     (mapv keyword))

; Should print [:a :b :c]

Конечно, это становится немного сложнее, если структура вложенная, но это та же общая идея.


Поскольку JSON не распознает концепцию «ключевого слова», нет простого способа преобразования между двумя форматами и поддержания того, что является строкой и что является ключевым словом.Если вам действительно нужно различать, вы можете использовать формат EDN Clojure вместо JSON.Это будет работать только в том случае, если вы не выполняете чрезмерное взаимодействие с JavaScript.Любые данные, которыми обмениваются с простой библиотекой JS, будут включать в себя сочетание ключевых слов и строк, если библиотека не понимает форматирование EDN, или вы делаете что-то неудачное, например, прикрепляете к объекту какие-то метаданные, указывающие, что является ключевым словом, а что нет.

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

...