使用jq为JSON添加字段时如何强制字段值为浮点数值类型
问题原因
- 使用
--arg传入的参数会被jq统一处理为字符串类型,因此第一次执行命令时1.2被转成了字符串值,才会出现带双引号的结果。 - 使用
--argjson传入参数时,jq会按照JSON语法解析传入值,但JSON规范中数值类型不区分整数、浮点数,jq默认输出规则是:无小数位的数值直接输出整数格式,有小数位的数值保留小数部分,因此传入1时默认输出1而非1.0。
实现方案
按需选下面两种方案即可:
- 传参时直接传入带小数位的浮点值给
--argjson
直接在参数里写1.0,jq解析后就会按浮点格式输出:
执行输出:echo '{"field": "value"}' | jq --arg id 21841453190106 --argjson price 1.0 '.+ {$price}'{ "field": "value", "price": 1.0 } - 在jq过滤逻辑中强制做浮点转换
如果传入的price参数是上游动态传递的整数,没法在传参时固定写.0,可以在jq表达式里通过算术运算把值转成浮点数,比如给值加0.0:
这种写法兼容性更好:如果传入的是整数echo '{"field": "value"}' | jq --arg id 21841453190106 --argjson price 1 '.+ {price: ($price + 0.0)}'1,输出就是1.0;如果传入的本身是浮点数1.2,计算后结果还是1.2,不会改变原有浮点值的精度。
补充说明:JSON标准本身没有对整数、浮点数做类型区分,二者统一属于number类型,jq默认的整数格式输出不影响JSON的类型正确性,只是展示格式的差异。
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

