Clojure 使用 ring-json 编码 Joda DateTime
Clojure encode Joda DateTime with ring-json
使用以下应用程序:
; src/webapp/core.clj
(ns webapp.core
(:require [compojure.core :refer [defroutes GET]]
[ring.middleware.json :as mid-json]
[clj-time.jdbc]))
(defn foo [request]
{:body {:now (org.joda.time.DateTime/now)}})
(defroutes routes
(GET "/foo" [] foo))
(def app
(-> routes
(mid-json/wrap-json-response)))
点击 /foo 端点给我这个错误:
com.fasterxml.jackson.core.JsonGenerationException: 无法 JSON 编码 class 的对象: class org.joda.time.DateTime: 2017-10-21T03:38:16.207Z
有没有简单的方法让ring-json对DateTime对象进行编码?我是否必须编写自己的中间件才能将其转换为例如首先是字符串?如果是这样,我该怎么做? (我以前从来没有写过环形中间件)。
我的 project.clj 具有以下依赖项,仅供参考:
[[org.clojure/clojure "1.8.0"]
[org.clojure/java.jdbc "0.6.1"]
[ring/ring-jetty-adapter "1.4.0"]
[compojure "1.4.0"]
[ring/ring-json "0.4.0"]
[clj-time "0.14.0"]]
如果您使用 Cheshire 生成 JSON,您可以扩展其协议来处理序列化,那么它应该 "just work":
(extend-protocol cheshire.generate/JSONable
org.joda.time.DateTime
(to-json [dt gen]
(cheshire.generate/write-string gen (str dt))))
此外,以下修改使其适用于使用时间库的项目 tick.alpha.api。我收到错误
#error {:cause Cannot JSON encode object of class:
class java.time.Instant: 2019-10-23T00:31:40.668Z
:via
[{:type com.fasterxml.jackson.core.JsonGenerationException
:message Cannot JSON encode object of class:
class java.time.Instant: 2019-10-23T00:31:40.668Z
:at [cheshire.generate$generate invokeStatic generate.clj 152]}]
在文件中实施以下内容 db/core.clj
解决了我的问题。
(extend-protocol cheshire.generate/JSONable
java.time.Instant
(to-json [dt gen]
(cheshire.generate/write-string gen (str dt))))
使用以下应用程序:
; src/webapp/core.clj
(ns webapp.core
(:require [compojure.core :refer [defroutes GET]]
[ring.middleware.json :as mid-json]
[clj-time.jdbc]))
(defn foo [request]
{:body {:now (org.joda.time.DateTime/now)}})
(defroutes routes
(GET "/foo" [] foo))
(def app
(-> routes
(mid-json/wrap-json-response)))
点击 /foo 端点给我这个错误:
com.fasterxml.jackson.core.JsonGenerationException: 无法 JSON 编码 class 的对象: class org.joda.time.DateTime: 2017-10-21T03:38:16.207Z
有没有简单的方法让ring-json对DateTime对象进行编码?我是否必须编写自己的中间件才能将其转换为例如首先是字符串?如果是这样,我该怎么做? (我以前从来没有写过环形中间件)。
我的 project.clj 具有以下依赖项,仅供参考:
[[org.clojure/clojure "1.8.0"]
[org.clojure/java.jdbc "0.6.1"]
[ring/ring-jetty-adapter "1.4.0"]
[compojure "1.4.0"]
[ring/ring-json "0.4.0"]
[clj-time "0.14.0"]]
如果您使用 Cheshire 生成 JSON,您可以扩展其协议来处理序列化,那么它应该 "just work":
(extend-protocol cheshire.generate/JSONable
org.joda.time.DateTime
(to-json [dt gen]
(cheshire.generate/write-string gen (str dt))))
此外,以下修改使其适用于使用时间库的项目 tick.alpha.api。我收到错误
#error {:cause Cannot JSON encode object of class:
class java.time.Instant: 2019-10-23T00:31:40.668Z
:via
[{:type com.fasterxml.jackson.core.JsonGenerationException
:message Cannot JSON encode object of class:
class java.time.Instant: 2019-10-23T00:31:40.668Z
:at [cheshire.generate$generate invokeStatic generate.clj 152]}]
在文件中实施以下内容 db/core.clj
解决了我的问题。
(extend-protocol cheshire.generate/JSONable
java.time.Instant
(to-json [dt gen]
(cheshire.generate/write-string gen (str dt))))