gojqjq 的纯 Go 实现

联合创作 · 2023-09-21 19:56

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)。
浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报