获取代理内容并将其转换为 JSON

get agent content and convert it to JSON

我还是 clojure 的新手,我正在尝试构建读取两个文件并将差异写入 JSON 文件

的应用程序
(defn read-csv
  "reads data."
 []
(with-open [rdr ( 
                   io/reader  "resources/staples_data.csv")]
  (doseq [line (rest(line-seq rdr))]
   (println(vec(re-seq #"[^,]+" line))))))

(defn read-psv
  "reads data."
 []
(with-open [rdr ( 
                   io/reader  "resources/external_data.psv")]
  (doseq [line (rest(line-seq rdr))]
  ; (print(vec(re-seq #"[^|]+" line))))))
(doall(vec(re-seq #"[^|]+" line))))))


(defn process-content []
  (let [csv-records (agent read-csv)
        psv-records (agent read-psv)]
      (json/write-str {"my-data" @csv-records "other-data" @psv-records}))
  )

我遇到异常:异常不知道如何写 JSON of class $read_csv clojure.data.json/write-generic (json.clj:385)

请帮忙解释一下,在此先感谢!

您正在为代理提供一个函数作为其初始值。也许您打算改为对该函数进行异步调用?在这种情况下,future 更适合您的场景,如图所示。 agent 是同步的,sendsend-off 是异步的,它们假设您正在跨调用传播某些状态,这与您在此处的用法不匹配。

(defn process-content []
  (let [csv-records (future-call read-csv)
        psv-records (future-call read-psv)]
      (json/write-str {"my-data" @csv-records "other-data" @psv-records})))

之后的问题是doseq只是副作用,总是returns nil。如果你想从 csv 文件中读取结果(急切地评估所以你仍然在 with-open 调用的范围内),请使用 (doall (for ...)) 代替 (doseq ...)。此外,read-csv 中的 println 需要删除,或替换为 (doto (vec (re-seq #"[^,]+" line)) println),因为 println 总是 returns nil,我假设您想要文件中的实际数据,不是 nils 列表。