如何在Clojure中按指定日期过滤经Cheshire解析的JSON对象集合?
如何在Clojure中按指定日期过滤JSON对象集合
我来帮你搞定这个问题!首先得说清楚,你之前用contains?没成功很正常——这个函数是用来检查集合里有没有某个键(对map而言)或者某个元素(对集合而言),不是用来比较值的,这就是问题所在。
下面分两种常见情况给你具体实现:
情况1:JSON里的日期是纯"YYYY-MM-DD"字符串
如果你的JSON对象解析成Clojure map后,日期字段(比如:order-date)直接存的是目标格式的字符串,那直接比较字符串相等就可以:
(defn filter-by-date [target-date orders] (filter (fn [order] ;; 把:order-date换成你实际的日期字段键 (= target-date (:order-date order))) orders))
举个例子,假设你有解析后的订单集合:
(def sample-orders [{:order-id 1, :order-date "2015-01-10", :total 99.99} {:order-id 2, :order-date "2015-01-11", :total 49.99} {:order-id 3, :order-date "2015-01-10", :total 149.99}]) ;; 调用过滤函数 (filter-by-date "2015-01-10" sample-orders)
执行后会返回所有日期匹配的订单对象:
;; => ({:order-id 1, :order-date "2015-01-10", :total 99.99} {:order-id 3, :order-date "2015-01-10", :total 149.99})
情况2:JSON里的日期带时间(比如ISO格式"2015-01-10T12:34:56Z")
如果日期字段是带时间的完整ISO字符串,那我们需要提取前10位(正好是"YYYY-MM-DD"部分)再比较:
(defn filter-by-date [target-date orders] (filter (fn [order] (let [full-date (:order-date order) ;; 截取前10个字符拿到日期部分 date-part (subs full-date 0 10)] (= target-date date-part))) orders))
注意事项
- 如果你的JSON解析后用的是字符串键(比如"orderDate"而不是关键字
:order-date),记得把(:order-date order)换成(get order "orderDate")来获取字段值。 - 如果你需要更严谨的日期处理(比如处理不同时区、格式转换),可以用
clj-time或者Java的java.time库,但如果只是简单的字符串匹配,上面的方法足够高效。
内容的提问来源于stack exchange,提问作者podomunro
相关产品推荐
相关产品推荐

