2024 Clojure 状况调查!分享您的想法。

欢迎!请查看关于页面,了解更多关于此如何运作的信息。

0 投票
data.json
重新标签

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

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

通过在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 问题的补丁文件。看起来你已经有了一个数字证书,你可以通过遵循https://clojure.org/dev/dev#_becoming_a_contributor上的信息来请求一个 jira 账户,提交修复请求,然后你可以直接将补丁文件添加到 jira。
...