Json 如何在Clojure中创建动态关键字?
我有一些JSON,看起来像这样:Json 如何在Clojure中创建动态关键字?,json,clojure,Json,Clojure,我有一些JSON,看起来像这样: {u gallery123abc:“foo”} 但也可能是这样的: {u gallery789xyz:“foo”} 在Clojure中有没有一种方法可以创建一个关键字来接受正则表达式,这样我就可以获得“_gallery”值,而不管结尾字符是什么?类似于((关键字#“^_gallery”)数据的东西)其中数据是我的JSON 我需要它在一个链中工作,这样我就可以遍历结构,如:(>数据:响应:节点:_gallery:slides:title)尝试通过与正则表达式匹配的
{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遍历节点,你想这样做什么?你是对的。那不清楚,所以我加进去了。我找到了另一种使用拉链的方法,但我之所以这么问是因为我很好奇是否还有其他方法。