2013-05-17 11 views
6

Ho una UUID e la data di utilizzo java che ottengono valori letterali come #uuid e #inst, come posso specificare uuid o data senza fare riferimento ai letterali stessi? CLJ-JSON non piace trattare con loro e finisce per gettare un errore quando provo generate-stringaRimuovere i valori letterali #inst e #uuid nel 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 

risposta

6

Non sono sicuro, ma sembra che quello che vi serve:

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

per data bisogno di scegliere il giusto formato Vale a dire:

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

che funziona per uuid ma per Data in realtà cambia il formato della data! aggiornerò la domanda, grazie – scape

+0

@scape Aggiornato la mia risposta con la formattazione della data. –

+0

grazie per quello, speravo di mantenere la formattazione nel caso in cui volessi usarlo per un facile confronto in clojure. Sono curioso di sapere perché cambia il formato quando viene convertito in una stringa. – scape

4

È possibile utilizzare questa libreria, che sostiene UUID e date https://github.com/dakrone/cheshire

Secondo la pagina del progetto "Cheshire è veloce JSON codifica, in base al largo di CLJ-JSON e clojure-JSON, con l'aggiunta di caratteristiche come la codifica Date/UUID/Set/Symbol e SMILE. "

+0

questa è la risposta migliore. – Kevin

3

Il timestamp è un oggetto che non ha "formato". Puoi scegliere di formattare da solo come testo o utilizzare ad es. cheshire per generare JSON. Cheshire sa che tipo di formato data va bene con JSON e può fare la conversione.

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

stampante Clojure sa rappresentare oggetti binari per gli esseri umani:

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

È possibile scegliere una rappresentazione di testo da soli:

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" 

Giusto per fare la distinzione chiara, l'oggetto può anche essere presentato come valori di byte, che è senza perdite:

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

Per quanto riguarda la data e l'ora, è meglio usare semplicemente clj-time, che è un wrapper attorno alle librerie del tempo di joda. Questo evita di dover gestire la data icky java, il calendario dell'ora, il materiale in formato.

Ho anche recentemente visto una biblioteca CLJ-uuid su GitHub, che potrebbe rendere il lavoro con UUID un po 'più clojurish

Problemi correlati