Clojure将{“a.b”1、“a.c”2、“d.e”3}转换为{:a{:b 1,:c 2},:d{:e 3}(用于具有monger层次结构的compojure/hiccup)

Clojure将{“a.b”1、“a.c”2、“d.e”3}转换为{:a{:b 1,:c 2},:d{:e 3}(用于具有monger层次结构的compojure/hiccup),clojure,compojure,hiccup,monger,Clojure,Compojure,Hiccup,Monger,我的mongodb模式有一个JSON层次结构。当我从compojure获取字段参数时,散列是以平点符号表示的,如{“a.b”1、“a.c”2、“d.e”3}。我想使用monger插入数据,但这需要一种真正的层次结构格式,如{:a{:b1,:c2},:d{:e3}。有什么方法可以自动从一个转换到另一个吗?据我所知,没有自动转换的方法,但是手动转换非常简单: => (require 'clojure.string) => (defn nest-keys [x] (reduce

我的mongodb模式有一个JSON层次结构。当我从compojure获取字段参数时,散列是以平点符号表示的,如
{“a.b”1、“a.c”2、“d.e”3}
。我想使用monger插入数据,但这需要一种真正的层次结构格式,如
{:a{:b1,:c2},:d{:e3}
。有什么方法可以自动从一个转换到另一个吗?

据我所知,没有自动转换的方法,但是手动转换非常简单:

=> (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}}

真的很棒!你能想出一个同样简洁的反向转换吗?反向转换的逻辑有点复杂,但我想到的是: