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投票
by

增加了一个补丁,以更简洁的方式显示更改。

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