我已经解析了大量的json,操纵了一些值,我想把它写回来.Aeson将数字解码为科学,但是当它编码时,默认情况下,科学在很多情况下用科学记数法显示数字,而且aeson没有提供任何我可以看到的改变它的方法.
> decode "[\"asdf\", 1, 1.0, 1000000000.1, 0.01]" :: Maybe Value
Just (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
encode (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]"
> encode (Array [String "asdf", Number 1, Number 1.0, Number 1000000000.1, Number 0.01])
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]"
Run Code Online (Sandbox Code Playgroud)
如何以更广泛接受的格式用其他语言可以使用的数字写出我的值?让我假装我不关心精度损失或整数溢出.科学软件包具有以这种方式格式化数字的方法,aeson恰好没有使用它.
>formatScientific Fixed Nothing (0.01)
"0.01"
>formatScientific Fixed Nothing (1000000000.1)
"1000000000.1"
Run Code Online (Sandbox Code Playgroud)
Aeson 的漂亮打印机(仅从版本 0.8 开始,最近)有一个配置选项,可以完全满足您的要求:
Prelude> :m +Data.Aeson Data.Aeson.Encode.Pretty
Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty' (defConfig{confNumFormat=Decimal}) (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1000000000.1,\n 0.01\n]"
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个漂亮的打印机现在输出实际的整数而1.0不是1,我认为这比用科学记数法打印小数要严重得多(这实际上应该在任何地方都可以)。默认设置也会发生这种情况:
Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1.0000000001e9,\n 1.0e-2\n]"
Run Code Online (Sandbox Code Playgroud)
0.7.2 版本仍然打印没有小数部分的整数,就像正常的 aesonencode一样:
aeson-pretty-0.7.2:Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1,\n 1,\n 1.0000000001e9,\n 1.0e-2\n]"
Run Code Online (Sandbox Code Playgroud)
我想我会将其作为错误报告提交。
请注意,还有一个选项可以让您完全控制数字的显示方式。Custom NumberFormat