2013-05-17 33 views
6

我有一個UUID和java util日期,它們將文字作爲#uuid和#inst,我如何指定uuid或日期而不引用文字本身? CLJ-JSON不喜歡與他們打交道,並最終拋出一個錯誤,當我嘗試生成字符串在clojure中刪除#inst和#uuid文字

{: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 

回答

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" 
+0

對於UUID工程工作,但對於日期實際上改變了日期格式!我會更新問題,謝謝 – scape

+0

@scape用日期格式更新了我的答案。 –

+0

謝謝你,我希望保持格式,以防我想用clojure進行簡單的比較。我很好奇它爲什麼在轉換爲字符串時改變格式 – scape

4

你可以使用這個庫,它支持UUID和日期https://github.com/dakrone/cheshire

根據項目頁面「柴快JSON編碼,基於斷CLJ-JSON和Clojure的,JSON的,額外的諸如Date/UUID/Set/Symbol編碼和SMILE支持等功能。「

+0

這是更好的答案。 – Kevin

3

時間戳是一個沒有「格式」的對象。您可以選擇格式爲自己的文本或使用cheshire來生成JSON。柴郡知道什麼樣的日期格式適合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 [email protected]> 
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) 
2

對於日期和時間的東西,你最好只使用clj-time,這是一個圍繞喬達時間庫的包裝。這避免了必須處理java日期,時間日曆,格式的東西。

我也看到最近在GitHub上一個CLJ-UUID庫,這可能使用的UUID多一點clojurish