You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:58:24