Json 如何在Clojure中创建动态关键字?

Json 如何在Clojure中创建动态关键字?,json,clojure,Json,Clojure,我有一些JSON,看起来像这样: {u gallery123abc:“foo”} 但也可能是这样的: {u gallery789xyz:“foo”} 在Clojure中有没有一种方法可以创建一个关键字来接受正则表达式,这样我就可以获得“_gallery”值,而不管结尾字符是什么?类似于((关键字#“^_gallery”)数据的东西)其中数据是我的JSON 我需要它在一个链中工作,这样我就可以遍历结构,如:(>数据:响应:节点:_gallery:slides:title)尝试通过与正则表达式匹配的

我有一些JSON,看起来像这样:

{u gallery123abc:“foo”}

但也可能是这样的:

{u gallery789xyz:“foo”}

在Clojure中有没有一种方法可以创建一个关键字来接受正则表达式,这样我就可以获得“_gallery”值,而不管结尾字符是什么?类似于
((关键字#“^_gallery”)数据的东西)
其中
数据
是我的JSON


我需要它在一个链中工作,这样我就可以遍历结构,如:
(>数据:响应:节点:_gallery:slides:title)

尝试通过与正则表达式匹配的键获取值:

for(var key in data) {
     if(/^_gallery/.test(key))
    ... do something with obj[key]
 }

我想,为这一点提供一些实用功能是明智的:

(defn key-like [m k]
  (let [s (name k)]
    (some #(when (clojure.string/starts-with? (name (key %)) s)
             (val %))
          m)))
然后你可以用你想要的方式使用它:

user> (-> {:a {:b {:_gallery123 {:d "BOOM!"}}}}
          :a
          :b
          (key-like :_gallery)
          :d)
;;=> "BOOM!"
另一种方法是生成一些函数,而不是
->
(如
get in
),该函数能够根据传递的类型检索键

(defn find-key [m k]
  (if (instance? java.util.regex.Pattern k)
    (some #(when (re-matches k (name (key %)))
             (val %))
          m)
    (get m k)))


(defn get-in+ [m & ks]
  (reduce (fn [curr-val k]
            (if (nil? curr-val) (reduced nil)
                (find-key curr-val k)))
          m ks))

user> (get-in+ {:a {:b {:_gallery123asd {:d "BOOM!"}}}}
               :a
               :b
               #"_gallery\d{3}\w{3}"
               :d)

我需要它在一个链中工作,这样我就可以遍历结构,比如:
(>数据:响应:节点:\u gallery:slides:title)
这不是问题的一部分,但是对我来说,你可以只使用data.response.nodes遍历节点,你想这样做什么?你是对的。那不清楚,所以我加进去了。我找到了另一种使用拉链的方法,但我之所以这么问是因为我很好奇是否还有其他方法。