Skip to content

Commit

Permalink
Add the ability to specify non-ascii escaping if desired
Browse files Browse the repository at this point in the history
Conflicts:
	README.md
	test/cheshire/test/core.clj
	test/cheshire/test/custom.clj
  • Loading branch information
dakrone committed Aug 29, 2012
1 parent 60d401a commit bacb3ac
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 22 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ encoders.
;; "eggplant" : [ 1, 2, 3 ]
;; }
;; }

;; generate JSON escaping UTF-8
(generate-string {:foo "It costs £100"} {:escape-non-ascii true})
;; => "{\"foo\":\"It costs \\u00A3100\"}"
```

In the event encoding fails, Cheshire will throw a JsonGenerationException.
Expand Down Expand Up @@ -212,6 +216,8 @@ Cheshire encoding supports:
### Also supports
- Stream encoding/decoding
- Lazy decoding
- Pretty-printing JSON generation
- Unicode escaping
- Arbitrary precision for decoded values:

Cheshire will automatically use a BigInteger if needed for
Expand Down
5 changes: 3 additions & 2 deletions project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
[org.clojure/data.json "0.1.2"]
[clj-json "0.5.0"]]}
:1.2 {:dependencies [[org.clojure/clojure "1.2.1"]]}
:1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]}}
:aliases {"all" ["with-profile" "dev,1.2:dev,1.3:dev"]}
:1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]}
:1.5 {:dependencies [[org.clojure/clojure "1.5.0-alpha3"]]}}
:aliases {"all" ["with-profile" "dev,1.2:dev,1.3:dev:dev,1.5"]}
:test-selectors {:default #(and (not (:benchmark %))
(not (:generative %)))
:benchmark :benchmark
Expand Down
25 changes: 14 additions & 11 deletions src/cheshire/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
(:use [cheshire.factory]
[cheshire.generate :only [generate]]
[cheshire.parse :only [parse]])
(:import (com.fasterxml.jackson.core JsonParser JsonFactory)
(:import (com.fasterxml.jackson.core JsonParser JsonFactory
JsonGenerator$Feature)
(com.fasterxml.jackson.dataformat.smile SmileFactory)
(java.io StringWriter StringReader BufferedReader BufferedWriter
ByteArrayOutputStream)))
Expand All @@ -17,11 +18,12 @@
(generate-string obj nil))
([obj opt-map]
(let [sw (StringWriter.)
generator (.createJsonGenerator ^JsonFactory (or *json-factory*
json-factory) sw)
generator (if (:pretty opt-map)
(doto generator .useDefaultPrettyPrinter)
generator)]
generator (.createJsonGenerator
^JsonFactory (or *json-factory* json-factory) sw)]
(when (:pretty opt-map)
(.useDefaultPrettyPrinter generator))
(when (:escape-non-ascii opt-map)
(.enable generator JsonGenerator$Feature/ESCAPE_NON_ASCII))
(generate generator obj
(or (:date-format opt-map) default-date-format)
(:ex opt-map))
Expand All @@ -37,11 +39,12 @@
([obj ^BufferedWriter writer]
(generate-stream obj writer nil))
([obj ^BufferedWriter writer opt-map]
(let [generator (.createJsonGenerator ^JsonFactory (or *json-factory*
json-factory) writer)
generator (if (:pretty opt-map)
(doto generator .useDefaultPrettyPrinter)
generator)]
(let [generator (.createJsonGenerator
^JsonFactory (or *json-factory* json-factory) writer)]
(when (:pretty opt-map)
(.useDefaultPrettyPrinter generator))
(when (:escape-non-ascii opt-map)
(.enable generator JsonGenerator$Feature/ESCAPE_NON_ASCII))
(generate generator obj (or (:date-format opt-map) default-date-format)
(:ex opt-map))
(.flush generator)
Expand Down
21 changes: 12 additions & 9 deletions src/cheshire/custom.clj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
(java.sql Timestamp)
(com.fasterxml.jackson.dataformat.smile SmileFactory)
(com.fasterxml.jackson.core JsonFactory JsonGenerator
JsonGenerator$Feature
JsonGenerationException JsonParser)))

;; date format rebound for custom encoding
Expand All @@ -28,10 +29,11 @@
(binding [*date-format* (or (:date-format opt-map) default-date-format)]
(let [sw (StringWriter.)
generator (.createJsonGenerator
^JsonFactory (or *json-factory* json-factory) sw)
generator (if (:pretty opt-map)
(doto generator .useDefaultPrettyPrinter)
generator)]
^JsonFactory (or *json-factory* json-factory) sw)]
(when (:pretty opt-map)
(.useDefaultPrettyPrinter generator))
(when (:escape-non-ascii opt-map)
(.enable generator JsonGenerator$Feature/ESCAPE_NON_ASCII))
(if obj
(to-json obj generator)
(.writeNull generator))
Expand All @@ -52,11 +54,12 @@
(encode-stream* obj w nil))
([obj ^BufferedWriter w opt-map]
(binding [*date-format* (or (:date-format opt-map) default-date-format)]
(let [generator (.createJsonGenerator ^JsonFactory
(or *json-factory* json-factory) w)
generator (if (:pretty opt-map)
(doto generator .useDefaultPrettyPrinter)
generator)]
(let [generator (.createJsonGenerator
^JsonFactory (or *json-factory* json-factory) w)]
(when (:pretty opt-map)
(.useDefaultPrettyPrinter generator))
(when (:escape-non-ascii opt-map)
(.enable generator JsonGenerator$Feature/ESCAPE_NON_ASCII))
(to-json obj generator)
(.flush generator)
w))))
Expand Down
4 changes: 4 additions & 0 deletions test/cheshire/test/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,7 @@
"\"quux\", [ 1, 2, 3 ] ]\n}")
(json/encode {:foo 1 :bar [{:baz 2} :quux [1 2 3]]}
{:pretty true}))))

(deftest t-unicode-escaping
(is (= "{\"foo\":\"It costs \\u00A3100\"}"
(json/encode {:foo "It costs £100"} {:escape-non-ascii true}))))
4 changes: 4 additions & 0 deletions test/cheshire/test/custom.clj
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,7 @@
"\"quux\", [ 1, 2, 3 ] ]\n}")
(json/encode {:foo 1 :bar [{:baz 2} :quux [1 2 3]]}
{:pretty true}))))

(deftest t-unicode-escaping
(is (= "{\"foo\":\"It costs \\u00A3100\"}"
(json/encode {:foo "It costs £100"} {:escape-non-ascii true}))))

0 comments on commit bacb3ac

Please sign in to comment.