gojq

jq 的纯 Go 实现
授权协议 MIT
开发语言 Google Go
所属分类 Web应用开发、 JSON/BSON开发包
软件类型 开源软件
地区 不详
投 递 者 龙俊英
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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)。
 相关资料
  • 问题内容: gevent和eventlet将greenlet包用于异步IO。它被编写为C扩展,因此不适用于Jython或IronPython。如果性能无关紧要,那么在纯Python中实现greenlet API的最简单方法是什么。 一个简单的例子: 应该打印12、56、34(而不是78)。 问题答案: 自2.5版以来,内置于标准Python发行版中的协同例程可以实现这种目的。如果IronPytho

  • 问题内容: 是否有GraphViz的开源Java替代品?我知道存在Grappa,它基本上将Graph接口包装为GraphViz作为JavaAPI。但是,布局仍由GraphViz二进制文件完成。 我正在寻找一个纯Java的开源库,它提供与GraphViz相同的功能和布局算法。 问题答案: 您可以看一下具有可视化和分析功能的JUNG(Java通用网络/图形框架)。它是开源的。

  • 主要内容:写纯文本文件,读纯文本文件Go语言提供了很多文件操作的支持,在不同场景下,有对应的处理方式,本节我们来介绍一下文本文件的读写操作。 写纯文本文件 由于Go语言的 fmt 包中打印函数强大而灵活,写纯文本数据非常简单直接,示例代码如下所示: 运行上面代码会在当前目录下生成一个 output.txt 文件,文件内容如下: https://www.xnip.cn/golang/ https://www.xnip.cn/golan

  • 本文向大家介绍纯Javascript实现ping功能的方法,包括了纯Javascript实现ping功能的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了纯Javascript实现ping功能的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 问题内容: 在纯Javascript中有AAAX Post的任何实现(也许使用xmlhttprequest)吗? 例如,如果我有这样的表格: 这是我在jQuery中对AJAX的实现 我可以在 不 使用jQuery的情况下做同样的事情吗?如果有可能, 如何 将上述jQuery代码实现为纯Java代码? 问题答案: 是的,当然有可能:) JS server.php 说明: 函数采用其类名称的形式元素并

  • 本文向大家介绍纯JSP实现的简单登录示例,包括了纯JSP实现的简单登录示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了纯JSP实现的简单登录的方法。分享给大家供大家参考,具体如下: 文件共有四个web.xml、login.jsp、logout.jsp、welcome.jsp四个文件 测试环境:Tomcat 6.0.x 假设项目名称是LoginSample,我的目录结构是这样的 ...\

  • 本文向大家介绍纯js+css实现在线时钟,包括了纯js+css实现在线时钟的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js+css实现在线时钟的具体代码,供大家参考,具体内容如下 实现要点 1、transform-origin的基本点的应用 2、批量处理html和样式的信息 3、指证位置进行了优化(时针与小时和分针位置有关,分针与分和秒针位置有关)。 新增居中方式: 开启绝对定位

  • 本文向大家介绍纯JavaScript实现实时反馈系统时间,包括了纯JavaScript实现实时反馈系统时间的使用技巧和注意事项,需要的朋友参考一下 用javascript反馈系统时间 运用知识 JavaScript HTML DOM HTML DOM 中的setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回