2013-06-17 2 views
1

Моя схема mongodb имеет иерархию JSON. Когда я получаю параметры поля из compojure, хэш находится в плоской пунктирной нотации, например {"a.b" 1, "a.c" 2, "d.e" 3}. Я хочу использовать monger для вставки данных, но это ожидает реального иерархического формата, такого как {:a {:b 1, :c 2}, :d {:e 3}}. Есть ли способ автоматически конвертировать из одного в другой?Clojure конвертировать {"ab" 1, "ac" 2, "de" 3} в {: a {: b 1,: c 2},: d {: e 3}} (для compojure/hiccup с более молодой иерархией)

ответ

3

Ничего автоматический, что я не знаю, но это довольно просто сделать преобразование вручную:

=> (require 'clojure.string) 
=> (defn nest-keys [x] 
    (reduce (fn [m [k v]] 
       (assoc-in m (map keyword (clojure.string/split k #"\.")) v)) 
      {} 
      x)) 
=> (nest-keys {"a.b" 1 "a.c" 2 "d.e" 3}) 
{:d {:e 3}, :a {:c 2, :b 1}} 
+0

Действительно здорово! Есть ли вероятность, что вы можете придумать одинаково краткий обратный конверсионный режим? – lobsterism

+0

Логика для реверса немного сложнее, но вот что я придумал: https://gist.github.com/alexhall/5799651 – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^