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
的任何选项或其他参数
如果数字稍微修改一下 .1
或 0.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 中。
(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
的任何选项或其他参数
如果数字稍微修改一下 .1
或 0.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 中。