删除clojure中的#inst和#uuid文字

时间:2013-05-17 13:31:36

标签: json clojure literals

我有一个UUID和java util日期,它将文字作为#uuid和#inst,如何在不引用文字本身的情况下指定uuid或日期? clj-json不喜欢处理它们,当我尝试使用generate-string

时最终会抛出错误
{:timestamp (java.util.Date.)}
;{:timestamp #inst "2013-05-17T13:45:24.095-00:00"}

;but as a string the date changes format
{:timestamp (str (java.util.Date.))}
{:timestamp "Fri May 17 09:45:44 EDT 2013"}

(json/generate-string {:uuid (java.util.UUID/randomUUID)}) 
;#uuid "d66cf77f-13b6-4291-95cd-c2bb40aa36b3"

java.lang.Exception: Cannot generate d66cf77f-13b6-4291-95cd-c2bb40aa36b3
JsonExt.java:96 clj_json.JsonExt$Generator.generate
JsonExt.java:83 clj_json.JsonExt$Generator.generate
JsonExt.java:103 clj_json.JsonExt.generate
core.clj:18 clj-json.core/generate-to-writer
core.clj:26 clj-json.core/generate-string
NO_SOURCE_FILE:32 myapp.handler/eval8390

4 个答案:

答案 0 :(得分:6)

不确定,但它看起来像你需要的东西:

user=> (str (java.util.UUID/randomUUID))
"91d7fcc5-d24d-4e33-a111-6ba69d14eb6a"

对于日期,您需要选择正确的格式。即:

user=> (import java.text.SimpleDateFormat)
java.text.SimpleDateFormat
user=> (.format (SimpleDateFormat. "yyyy/MM/dd HH:mm:ss") (java.util.Date.))
"2013/05/17 16:49:58"

答案 1 :(得分:5)

您可以使用此库,该库支持UUID和日期https://github.com/dakrone/cheshire

根据项目页面“Cheshire是快速JSON编码,基于clj-json和clojure-json,具有日期/ UUID /设置/符号编码和SMILE支持等附加功能。”

答案 2 :(得分:4)

时间戳是没有“格式”的对象。您可以选择自己格式化为文本或使用例如cheshire生成JSON。 Cheshire知道什么样的日期格式适合JSON并且可以进行转换。

user> (def x (java.util.Date.))      
#'user/x                   ; x points to a Date object (not text)

Clojure打印机知道如何向人类表示二进制对象:

user> x
#inst "2015-02-13T06:24:09.629-00:00"
user> (pr-str x)
"#inst \"2015-02-13T06:24:09.629-00:00\""

您可以自己选择文字表示:

user> (str x)
"Fri Feb 13 08:24:09 EET 2015"       ; default format of java.util.Date
user> (.format (java.text.SimpleDateFormat. "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") x)
"2015-02-13T08:24:09.629+02:00"

为了区分清楚,对象也可以表示为字节值,这是无损的:

user> (def outs (java.io.ByteArrayOutputStream.))
#'user/outs
user> (doto (java.io.ObjectOutputStream. outs) (.writeObject x) (.close))
#<ObjectOutputStream java.io.ObjectOutputStream@2bd682ed>
user> (seq (.toByteArray outs))
(-84 -19 0 5 115 114 0 14 106 97 118 97 46 117 116 105 108 46 68 97 116 101 104 106 -127 1 75 89 116 25 3 0 0 120 112 119 8 0 0 1 75 -127 -101 -39 -99 120)

答案 3 :(得分:2)

对于日期和时间的东西,你最好只使用clj-time,这是joda时间库的包装。这避免了必须处理icky日期,时间日历,格式的东西。

我最近也在github上看到了一个clj-uuid库,这可能会让你的uuids工作更加盲目