2013-05-17 6 views
6

Ich habe eine UUID und ein Java-Util-Date, die Literale als #uuid und #inst erhalten, wie gebe ich die Uuid oder das Datum an, ohne auf die Literale selbst zu verweisen? CLJ-json nicht mag den Umgang mit ihnen und landet einen Fehler zu werfen, wenn ich generieren-string versuchen#inst und #uuid Literale in clojure entfernen

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

Antwort

6

Nicht sicher, aber es sieht aus wie das, was Sie brauchen:

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

Für Datum Sie muss das richtige Format wählen. Dh:

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

, die für die UUID arbeitet machen die Arbeit könnte aber für Date es tatsächlich ändert das Datumsformat! Ich werde Frage aktualisieren, danke – scape

+0

@scape Aktualisierte meine Antwort mit Datumsformatierung. –

+0

vielen Dank dafür, ich hatte gehofft, die Formatierung für den Fall, dass ich es für den Vergleich in clojure verwenden möchte. Ich bin neugierig, warum es das Format ändert, wenn in eine Zeichenfolge konvertiert – scape

4

Sie diese Bibliothek verwenden, die UUID unterstützt und Termine https://github.com/dakrone/cheshire

Nach der Projektseite „Cheshire ist schnell JSON-Codierung basiert weg von CLJ-json und Clojure-json, mit zusätzlichen Features wie Datum/UUID/Set/Symbol-Codierung und SMILE-Unterstützung. "

+0

das ist die bessere Antwort. – Kevin

3

Der Zeitstempel ist ein Objekt, das kein "Format" hat. Sie können wählen, ob Sie als Text selbst formatieren oder z. cheshire JSON zu generieren. Cheshire weiß, welches Datumsformat zu JSON passt und kann die Konvertierung durchführen.

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

Clojure Drucker weiß, wie binäre Objekte für die Menschen darstellen:

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

Sie eine Textdarstellung selbst wählen:

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" 

Nur den Unterschied deutlich zu machen, kann das Objekt auch als Byte-Werte dargestellt, die verlustfrei ist:

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

Für Datum und Zeit Zeug, Sie sind besser dran nur mit clj-Zeit, die ein Wrapper rund um die Joda-Zeit-Bibliotheken ist. Das vermeidet es, sich mit dem icky java date, dem Zeitkalender und den Formatierungen herumschlagen zu müssen.

Ich sah auch vor kurzem eine CLJ-UUID-Bibliothek auf Github, die mit UUID ein bisschen mehr clojurish