   "Parse a single item of JSON data from a java.io.Reader. Options are
   key-value pairs, valid options are:
 
-     :keywordize boolean 
-
-        If true (default) convert JSON property names from strings
-        into keywords.
-
      :bigdec boolean
 
         If true use BigDecimal for decimal numbers instead of Double.

     :eof-value Object

        Object to return if the stream is empty and eof-error? is
        false. Default is nil."
  [reader & options]
  (let [{:keys [keywordize eof-error? eof-value bigdec]
         :or {keywordize false
              bigdec false
              eof-error? true}} options]
    (binding [*keywordize* keywordize
              *bigdec* bigdec]
      (-parse reader eof-error? eof-value))))

(defn parse-string
  "Reads one JSON value from input String. Options are the same as for

                  (recur element result)
                  (throw (Exception. "JSON error (non-string key in object)")))
                (recur nil
                       (let [out-key (*key-fn* key)
                             out-value (*value-fn* out-key element)]
                         (if (= *value-fn* out-value)
                           result
                           (assoc! result out-key out-value)))))))))))

(defn- parse-hex-char [^PushbackReader stream]
  ;; Expects to be called with the head of the stream AFTER the
