st-json:write-json - 避免浮点数的指数标记

st-json:write-json - avoid exponent markers for floats

(st-json:write-json-to-string
  (st-json:read-json "{\"a\":0.1}"))

输出无效JSON:

"{\"a\":1.e-1}"

期望的输出:

"{\"a\":0.1}"

我在 https://marijnhaverbeke.nl/st-json/

上没有看到 write-json-to-string 的任何选项或其他参数

如果数字稍微修改一下 .10.10

我还是可以的

更新:有一个浮点格式的系统变量:“打印机使用*read-default-float-format*来指导指数标记的选择 打印浮点数时。"

根据这个例子...

(let ((*read-default-float-format* 'double-float))
  (read-from-string "(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)"))

==> (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0d0)

我正在使用的实现 (SBCL 2.0.11) 具有浮点格式 F 和 D。http://www.lispworks.com/documentation/lw50/CLHS/Body/v_rd_def.htm

我不确定“打印机在打印浮点数时如何使用 *read-default-float-format* 来指导指数标记的选择。” ...我下面的测试有问题吗?

 (progn
   (setf *read-default-float-format* 'long-float)
   (princ(st-json:write-json-to-string (st-json:read-json "{\"a\":0.1}")))
   (setf *read-default-float-format* 'single-float)
   (princ(st-json:write-json-to-string (st-json:read-json "{\"a\":0.1}")))
   (setf *read-default-float-format* 'double-float)
   (princ(st-json:write-json-to-string (st-json:read-json "{\"a\":0.1}")))
   (setf *read-default-float-format* 'short-float)
   (princ(st-json:write-json-to-string (st-json:read-json "{\"a\":0.1}"))))
   
 {"a":1.e-1}{"a":1.e-1}{"a":1.e-1}{"a":1.e-1}
 ==> "{\"a\":1.e-1}"

在此先感谢您的帮助!

*read-default-float-format*无关。

在 SLIME 中使用 M-.,我可以看到 write-json-to-string 调用 write-json,后者又调用 write-json-element.

write-json-element 是一个泛型函数,不同类型有不同的方法。 real 的方法是:

(defmethod write-json-element ((element real) stream)
  (format stream "~,,,,,,'eE" element))

该格式字符串是标准的 Common Lisp,导致您看到的行为。

CL-USER> (format t "~,,,,,,'eE" 0.1)
1.e-1
NIL
CL-USER> 

我不知道作者为什么这样做,但如果你坚持使用 st-json,只需将方法重新定义为(这将发出重新定义警告,但忽略它):

(defmethod st-json:write-json-element ((element real) stream)
  (format stream "~F" element))

但是,如果您可以切换到另一个库,请查看 jzon,它在最新的 Quicklisp 中。