我发现JavaScipt创建的json数据与使用bash(和其他编程语言)的jq
之间存在差异。使用JavaScript,即使我使用float()
,我也可以创建最多六位数的十进制数字。但是jq
与它不同,因为添加小数值只需要小数点后的四位数。
我的问题是我需要十进制数来存储在SQL中,在点之后最多六位数。
示例:
$ JSON='{"decimal":0.00001}'
$ echo "$JSON" | jq .
{
"decimal": 1e-05
}
我的目标是用这一行验证小数......
if [[ "$TMP_DECIMAL" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then
任何提示/建议?
答案 0 :(得分:6)
您无法更改jq
的行为 - 目前日期relevant feature requests仍然有效 - 但您可以重新格式化您的号码他们被检索后。例如:
json='{"decimal":0.00001}'
decimal=$(jq '.decimal' <<<"$json")
decimal_f=$(awk -v decimal="$decimal" 'BEGIN { printf("%f\n", decimal) }' </dev/null)
echo "JQ emitted $decimal; reformatted as $decimal_f"
答案 1 :(得分:3)
此外,您可以使用perl模块JSON::PP重新格式化JSON
。
perl -0777 -MJSON::PP -E '$s=<>; $j=JSON::PP->new->ascii->pretty->allow_nonref->allow_bignum;$p=$j->decode($s);say $j->encode($p)'
或更好:
perl -0777 -MJSON::PP -E '
$j=JSON::PP->new->ascii->pretty->allow_nonref->allow_bignum;
$p=$j->decode(<>);
say $j->encode($p)'
至关重要的是allow_bignum
。
示例:
echo '{"decimal":0.00000001}' | perl ....
打印
{
"decimal" : 0.00000001
}
但没有allow_bignum
打印
{
"decimal" : 1e-08
}
Ps:...还可以使用perl来验证整个json ......:)
答案 2 :(得分:1)
A commit made on Oct 21, 2019,确保jq通常保留数字的“外部”格式。有一些例外,例如多余的前导0。
以下页面提供有关安装jq的“未发布”版本的详细信息:https://github.com/stedolan/jq/wiki/Installation