2024 Clojure状态调查中分享您的想法!

欢迎!有关如何工作的更多信息,请查看关于页面。

0
data.json
重新标记

大多数 EOF 会产生有用的错误信息,例如 JSON 错误(字符串内的文件结尾)。但对象和数组读取器不会处理 EOF 并抛出无用的异常。

(clojure.data.json/read-str "{") 由于在 read-key 中的此行而抛出 字符的值超出范围:-1
(throw (Exception. (str "JSON 错误(非字符串键在对象中),找到 " (char c) ",期望 \"")))
(char c) 抛出异常,因为 c 是 -1。

这是通过在 read-key 中处理 -1 情况来修复的。

(defn- read-key [^PushbackReader stream]
  (let [c (int (next-token stream))]
    (if (= c (codepoint \"))
      (let [key (read-quoted-string stream)]
        (if (= (codepoint \:) (int (next-token stream)))
          key
          (throw (Exception. "JSON error (missing `:` in object)"))))
      (codepoint-case c
        \} nil
        -1 (throw (Exception. "JSON error (end-of-file inside object)"))
        (throw (Exception. (str "JSON error (non-string key in object), found `" (char c) "`, expected `\"`")))))))

(clojure.data.json/read-str "{\"\":\"\"") 显示不正确的错误信息:JSON 错误(对象中缺失条目)

这是通过在 read-object 中处理 EOF 来修复的。

  (codepoint-case (int (next-token stream))
    \, (recur r)
    \} (persistent! r)
    -1 (throw (Exception. "JSON error (end-of-file inside object)"))
    (throw (Exception. "JSON error (missing entry in object)"))))

(clojure.data.json/read-str "[") 抛出 JSON 错误(意外的字符):￿(意外的字符是 (char 65535))。这是因为 read-array 将 -1 压回到流中,而 -1 就被压回为 65535。

修正方法是处理 read-array 内部的 EOF。

(defn- read-array [^PushbackReader stream options]
  ;; Expects to be called with the head of the stream AFTER the
  ;; opening bracket.
  ;; Only handles array value.
  (let [c (int (next-token stream))]
    (codepoint-case c
      \] []
      \, (throw (invalid-array-exception))
      -1 (throw (Exception. "JSON error (end-of-file inside array)"))
      (do (.unread stream c)
          (read-array* stream options)))))

2 答案

0

已选择
 
最佳回答

登录为 https://clojure.atlassian.net/browse/DJSON-57

注意,需要考虑性能影响。最好将异常构造移动到单独的函数中,以减小字节码大小,使其更易于内联。

0

添加了补丁,以提供更简洁的更改视图。

我们通过添加到jira问题的补丁文件来工作。看起来您已经有了一个已签名的CA,您可以请求一个jira账户,通过遵循https://clojure.org/dev/dev#_becoming_a_contributor中的信息来提交贡献者支持请求,然后您可以直接将补丁文件添加到jira。
...