gojqjq 的纯 Go 实现
gojq 是一个用 Go 语言编写的 jq 命令的实现。你还可以将 gojq 作为库嵌入到你的 Go 产品中。
Usage
$ echo '{"foo": 128}' | gojq '.foo' 128 $ echo '{"a": {"b": 42}}' | gojq '.a.b' 42 $ echo '{"id": "sample", "10": {"b": 42}}' | gojq '{(.id): .["10"].b}' { "sample": 42 } $ echo '[{"id":1},{"id":2},{"id":3}]' | gojq '.[] | .id' 1 2 3 $ echo '{"a":1,"b":2}' | gojq '.a += 1 | .b *= 2' { "a": 2, "b": 4 } $ echo '{"a":1} [2] 3' | gojq '. as {$a} ?// [$a] ?// $a | $a' 1 2 3 $ echo '{"foo": 4722366482869645213696}' | gojq .foo 4722366482869645213696 # keeps the precision of large numbers $ gojq -n 'def fact($n): if $n < 1 then 1 else $n * fact($n - 1) end; fact(50)' 30414093201713378043612608166064768844377641568960512000000000000 # arbitrary-precision integer calculation
Nice error messages.
$ echo '[1,2,3]' | gojq '.foo & .bar' gojq: invalid query: .foo & .bar .foo & .bar ^ unexpected token "&" $ echo '{"foo": { bar: [] } }' | gojq '.' gojq: invalid json: <stdin> {"foo": { bar: [] } } ^ invalid character 'b' looking for beginning of object key string
与 jq 的区别
- gojq 完全用 Go 语言实现,完全可移植。jq 依赖于 C 标准库,因此数学函数的可用性取决于库。jq 还依赖于正则表达式库,它使构建脚本变得复杂。
- gojq 为无效查询和 JSON 输入实现了 nice error messages。jq 的错误信息有时很难说出要在哪里修复查询。
- gojq 不保留对象键的顺序。由于这个限制,gojq 没有
keys_unsorted
函数和--sort-keys
(-S
) 选项。 - gojq 支持任意精度整数计算,而 jq 不支持;jq 在涉及计算时会失去大整数的精度。请注意,即使使用gojq,所有的数学函数,包括floor和round,都会将整数转换为浮点数;只有加法、减法、乘法、modulo和除法运算符(可除时)保留整数的精度。要计算整数的地板除法而不损失精度,可以使用def idivide($n)。(. - . % $n) / $n;. 要将浮点数四舍五入为整数,可以使用def ifloor: floor | tostring | tonumber;,但要注意这个函数对大的浮点数不起作用,同时也会失去大整数的精度。
- gojq 修复了 jq 的各种 bug。
- gojq 实现
@uri
以转义 RFC 3986 第 2.2 节中定义的所有保留字符( jq#1506 ),并修复@base64d
以允许二进制字符串作为解码字符串 ( jq#1931 )。gojq改进了时间格式化和解析;处理strftime和strptime中的%f,用fromdate和fromdateiso8601解析时区偏移,用strptime中的%Z/%z支持时区名称/偏移,并在 daylight saving time 中用%Z格式化查找正确时区,gojq 在日期和时间函数中支持纳秒。 - gojq 故意不支持某些函数;get_jq_origin, get_prog_origin, get_search_list (不稳定,未在jq文档中列出), input_line_number, $__loc__ (性能问题), recurse_down (在jq中被废弃)。gojq不支持一些标志;--ascii-output, -a (性能问题), --seq (不常用), --sort-keys, -S (默认为排序,因为map[string]interface{}不保持顺序), --unbuffered (默认为未缓冲). gojq不解析jq支持的JSON扩展;NaN、Infinity和[000]。gojq将浮点数规范化,以适应双精度浮点数。gojq不支持某些正则表达式标志(正则表达式引擎差异)。gojq不支持BOM(编码/json不支持这个)。gojq不允许使用关键字作为函数名(声明def true: .; 是一个混乱的查询)。
- gojq 支持读取YAML 输入 (
--yaml-input
) ,而 jq 不支持。gojq 还支持 YAML 输出 (--yaml-output
)。
评论