Skip to content

Commit c8e4156

Browse files
committed
DJSON-50 Allow user to pass PushbackReader to read for repeated read on the same reader
Signed-off-by: Alex Miller <alex.miller@cognitect.com>
1 parent 3fa0d0a commit c8e4156

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

src/main/clojure/clojure/data/json.clj

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,12 @@
367367
:key-fn nil
368368
:value-fn nil})
369369
(defn read
370-
"Reads a single item of JSON data from a java.io.Reader. Options are
371-
key-value pairs, valid options are:
370+
"Reads a single item of JSON data from a java.io.Reader.
371+
372+
If you wish to repeatedly read items from the same reader, you must
373+
supply a PushbackReader and reuse it on subsequent calls.
374+
375+
Options are key-value pairs, valid options are:
372376
373377
:eof-error? boolean
374378
@@ -403,10 +407,13 @@
403407
collections."
404408
[reader & {:as options}]
405409
(let [{:keys [eof-error? eof-value]
406-
:or {eof-error? true}} options]
410+
:or {eof-error? true}} options
411+
pbr (if (instance? PushbackReader reader)
412+
reader
413+
(PushbackReader. reader 64))]
407414
(->> options
408415
(merge default-read-options)
409-
(-read (PushbackReader. reader 64) eof-error? eof-value))))
416+
(-read pbr eof-error? eof-value))))
410417

411418
(defn read-str
412419
"Reads one JSON value from input String. Options are the same as for

src/test/clojure/clojure/data/json_test.clj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@
77
(let [s (java.io.PushbackReader. (java.io.StringReader. "42"))]
88
(is (= 42 (json/read s)))))
99

10+
;; DJSON-50 - pass PBR to safely do reapeated read
11+
(deftest read-multiple
12+
(let [st "{\"foo\":\"some string\"}{\"foo\":\"another string\"}"
13+
srdr (java.io.StringReader. st)
14+
pbr (java.io.PushbackReader. srdr 64)]
15+
(is (= {"foo" "some string"} (json/read pbr)))
16+
(is (= {"foo" "another string"} (json/read pbr))))
17+
18+
(let [st "{\"foo\":\"some string\"}{\"foo\":\"another long ......................................................... string\"}"
19+
srdr (java.io.StringReader. st)
20+
pbr (java.io.PushbackReader. srdr 64)]
21+
(is (= {"foo" "some string"} (json/read pbr)))
22+
(is (= {"foo" "another long ......................................................... string"} (json/read pbr)))))
23+
1024
(deftest read-from-reader
1125
(let [s (java.io.StringReader. "42")]
1226
(is (= 42 (json/read s)))))

0 commit comments

Comments
 (0)