From 602b6e3ce9d5dcf1e5ae6960a309f9b5cb663ee2 Mon Sep 17 00:00:00 2001 From: Tom McMillen Date: Wed, 4 Mar 2015 01:25:06 +0000 Subject: [PATCH] Add JSON serialization of BSONTimestamp --- project.clj | 1 + src/clojure/monger/json.clj | 12 +++++++++++- test/monger/test/json_cheshire_test.clj | 16 ++++++++++++++++ test/monger/test/json_test.clj | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/monger/test/json_cheshire_test.clj create mode 100644 test/monger/test/json_test.clj diff --git a/project.clj b/project.clj index 0df12ea..b74dfdc 100644 --- a/project.clj +++ b/project.clj @@ -39,6 +39,7 @@ :dev {:resource-paths ["test/resources"] :dependencies [[clj-time "0.8.0" :exclusions [org.clojure/clojure]] [cheshire "5.3.1" :exclusions [org.clojure/clojure]] + [org.clojure/data.json "0.2.5" :exclusions [org.clojure/clojure]] [org.clojure/tools.cli "0.3.1" :exclusions [org.clojure/clojure]] [org.clojure/core.cache "0.6.3" :exclusions [org.clojure/clojure]] [ring/ring-core "1.3.0" :exclusions [org.clojure/clojure]] diff --git a/src/clojure/monger/json.clj b/src/clojure/monger/json.clj index d177f10..ae6cc53 100644 --- a/src/clojure/monger/json.clj +++ b/src/clojure/monger/json.clj @@ -10,7 +10,8 @@ (ns monger.json "Provides clojure.data.json/Write-JSON protocol extension for MongoDB-specific types, such as org.bson.types.ObjectId" - (:import org.bson.types.ObjectId)) + (:import org.bson.types.ObjectId + org.bson.types.BSONTimestamp)) ;; ;; Implementation @@ -47,6 +48,12 @@ ObjectId (-write [^ObjectId object out] (clojure.data.json/write (.toString object) out))) + + (extend-protocol clojure.data.json/JSONWriter + BSONTimestamp + (-write [^BSONTimestamp object out] + (clojure.data.json/write {:time (.getTime object) :inc (.getInc object)} out))) + (catch Throwable _ false)) (comment "Nothing to do, clojure.data.json is not available")) @@ -72,5 +79,8 @@ (cheshire.generate/add-encoder ObjectId (fn [^ObjectId oid ^com.fasterxml.jackson.core.json.WriterBasedJsonGenerator generator] (.writeString generator (.toString oid)))) + (cheshire.generate/add-encoder BSONTimestamp + (fn [^BSONTimestamp ts ^com.fasterxml.jackson.core.json.WriterBasedJsonGenerator generator] + (cheshire.generate/encode-map {:time (.getTime ts) :inc (.getInc ts)} generator))) (catch Throwable t false)) diff --git a/test/monger/test/json_cheshire_test.clj b/test/monger/test/json_cheshire_test.clj new file mode 100644 index 0000000..50046c9 --- /dev/null +++ b/test/monger/test/json_cheshire_test.clj @@ -0,0 +1,16 @@ +(ns monger.test.json-cheshire-test + (:require [clojure.test :refer :all] + [monger.json] + [cheshire.core :refer :all]) + (:import org.bson.types.ObjectId + org.bson.types.BSONTimestamp)) + +(deftest convert-dbobject-to-json + (let [input (ObjectId.) + output (generate-string input)] + (is (= (str "\"" input "\"") output)))) + +(deftest convert-bson-timestamp-to-json + (let [input (BSONTimestamp. 123 4) + output (generate-string input)] + (is (= "{\"time\":123,\"inc\":4}" output)))) diff --git a/test/monger/test/json_test.clj b/test/monger/test/json_test.clj new file mode 100644 index 0000000..5a3a572 --- /dev/null +++ b/test/monger/test/json_test.clj @@ -0,0 +1,16 @@ +(ns monger.test.json-test + (:require [clojure.test :refer :all] + [monger.json] + [clojure.data.json :as json]) + (:import org.bson.types.ObjectId + org.bson.types.BSONTimestamp)) + +(deftest convert-dbobject-to-json + (let [input (ObjectId.) + output (json/write-str input)] + (is (= (str "\"" input "\"") output)))) + +(deftest convert-bson-timestamp-to-json + (let [input (BSONTimestamp. 123 4) + output (json/write-str input)] + (is (= "{\"time\":123,\"inc\":4}" output))))