 	 (if eof-error?
 	   (throw (EOFException. "JSON error (end-of-file)"))
 	   eof-value)
-	 (cond
-          ;; Ignore whitespace
-          (Character/isWhitespace c) (recur (.read stream))
-
-          ;; Read numbers, true, and false with Clojure reader
-          (#{(codepoint \-) (codepoint \0) (codepoint \1) (codepoint \2) (codepoint \3) (codepoint \4) (codepoint \5) (codepoint \6) (codepoint \7) (codepoint \8) (codepoint \9)} c)
-          (do (.unread stream c)
-              (read stream true nil))
-
-          ;; Read strings
-          (= c (codepoint \")) (read-json-quoted-string stream)
-
-          ;; Read null as nil
-          (= c (codepoint \n)) (let [ull [(char (.read stream))
-                                          (char (.read stream))
-                                          (char (.read stream))]]
-                                 (if (= ull [\u \l \l])
-                                   nil
-                                   (throw (Exception. (str "JSON error (expected null): " c ull)))))
-
-          ;; Read true
-          (= c (codepoint \t)) (let [rue [(.read stream)
-                                          (.read stream)
-                                          (.read stream)]]
-                                 (if (= rue [(codepoint \r) (codepoint \u) (codepoint \e)])
-                                   true
-                                   (throw (Exception. (str "JSON error (expected true): " c rue)))))
-
-          ;; Read false
-          (= c (codepoint \f)) (let [alse [(.read stream)
-                                           (.read stream)
-                                           (.read stream)
-                                           (.read stream)]]
-                                 (if (= alse [(codepoint \a) (codepoint \l) (codepoint \s) (codepoint \e)])
-                                   false
-                                   (throw (Exception. (str "JSON error (expected false): " c alse)))))
-
-          ;; Read JSON objects
-          (= c (codepoint \{)) (read-json-object stream keywordize?)
-
-          ;; Read JSON arrays
-          (= c (codepoint \[)) (read-json-array stream keywordize?)
-
-          :else (throw (Exception. (str "JSON error (unexpected character): " (char c)))))))))
+	 (codepoint-case c
+           :whitespace (recur (.read stream))
+
+           ;; Read numbers with Clojure reader
+           (\- \0 \1 \2 \3 \4 \5 \6 \7 \8 \9)
+           (do (.unread stream c)
+               (read stream true nil))
+
+           ;; Read strings
+           \" (read-json-quoted-string stream)
+
+           ;; Read null as nil
+           \n (let [ull [(.read stream)
+                         (.read stream)
+                         (.read stream)]]
+                (if (= ull [(codepoint \u) (codepoint \l) (codepoint \l)])
+                  nil
+                  (throw (Exception. (str "JSON error (expected null): " c ull)))))
+
+           ;; Read true
+           \t (let [rue [(.read stream)
+                         (.read stream)
+                         (.read stream)]]
+                (if (= rue [(codepoint \r) (codepoint \u) (codepoint \e)])
+                  true
+                  (throw (Exception. (str "JSON error (expected true): " c rue)))))
+
+           ;; Read false
+           \f (let [alse [(.read stream)
+                          (.read stream)
+                          (.read stream)
+                          (.read stream)]]
+                (if (= alse [(codepoint \a) (codepoint \l) (codepoint \s) (codepoint \e)])
+                  false
+                  (throw (Exception. (str "JSON error (expected false): " c alse)))))
+
+           ;; Read JSON objects
+           \{ (read-json-object stream keywordize?)
+
+           ;; Read JSON arrays
+           \[ (read-json-array stream keywordize?)
+
+           (throw (Exception. (str "JSON error (unexpected character): " (char c)))))))))
 
 (defprotocol Read-JSON-From
   (read-json-from [input keywordize? eof-error? eof-value]

  ;; Expects to be called with the head of the stream AFTER the
  ;; initial backslash.
  (let [c (.read stream)]
    (cond
     (#{(codepoint \") (codepoint \\) (codepoint \/)} c) (char c)
     (= c (codepoint \b)) \backspace
     (= c (codepoint \f)) \formfeed
     (= c (codepoint \n)) \newline
     (= c (codepoint \r)) \return
     (= c (codepoint \t)) \tab
     (= c (codepoint \u)) (read-json-hex-character stream))))

(defn- read-json-quoted-string [^PushbackReader stream]
  ;; Expects to be called with the head of the stream AFTER the

  (let [buffer (StringBuilder.)]
    (loop [c (.read stream)]
      (when (neg? c) (throw (EOFException. "JSON error (end-of-file inside array)")))
      (codepoint-case c
          \" (str buffer)
          \\ (do (.append buffer (read-json-escaped-character stream))
                 (recur (.read stream)))
          (do (.append buffer (char c))
              (recur (.read stream)))))))

(defn- read-json-reader
  ([^PushbackReader stream keywordize? eof-error? eof-value]
