2013-05-17 27 views
6

Tôi có ngày UUID và java util có chữ như #uuid và #inst, làm cách nào để chỉ định uuid hoặc ngày mà không tham chiếu đến chính chữ? CLJ-json không thích đối phó với họ và kết thúc lên ném một lỗi khi tôi cố gắng tạo ra dâyXóa #inst và #uuid literals trong clojure

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

Trả lời

6

Không chắc, nhưng có vẻ như những gì bạn cần:

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

Đối ngày bạn cần chọn đúng định dạng. Ví dụ:

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

mà làm việc cho uuid nhưng đối với ngày nó thực sự làm thay đổi định dạng ngày! tôi sẽ cập nhật câu hỏi, cảm ơn – scape

+0

@scape Đã cập nhật câu trả lời của tôi với định dạng ngày. –

+0

cảm ơn vì điều đó, tôi đã hy vọng giữ định dạng trong trường hợp tôi muốn sử dụng nó để so sánh dễ dàng trong clojure. Tôi tò mò tại sao nó thay đổi định dạng khi chuyển đổi thành một chuỗi – scape

4

Bạn có thể sử dụng thư viện này, mà hỗ trợ UUID và Ngày https://github.com/dakrone/cheshire

Theo trang dự án "Cheshire là mã hóa JSON nhanh, dựa tắt của CLJ-json và clojure-json, với thêm các tính năng như mã hóa Date/UUID/Set/Symbol và hỗ trợ SMILE. "

+0

đây là câu trả lời hay hơn. – Kevin

3

Dấu thời gian là đối tượng không có "định dạng". Bạn có thể chọn định dạng là văn bản chính mình hoặc sử dụng ví dụ: cheshire để tạo JSON. Cheshire biết loại định dạng ngày nào hoạt động tốt với JSON và có thể thực hiện chuyển đổi.

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

máy in Clojure biết làm thế nào để đại diện cho đối tượng nhị phân cho con người:

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

Bạn có thể chọn một đoạn text để mình:

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" 

Chỉ cần để làm cho sự phân biệt rõ ràng, đối tượng có thể cũng được trình bày dưới dạng giá trị byte, không bị mất:

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

Đối với các công cụ ngày và giờ, bạn nên sử dụng clj-time, đây là một trình bao bọc xung quanh các thư viện thời gian joda. Điều này tránh phải đối phó với ngày tháng icky, lịch thời gian, công cụ định dạng.

Tôi cũng vừa nhìn thấy một thư viện CLJ-uuid trên github, mà có thể làm cho làm việc với UUIDs một chút clojurish hơn