昨天有个人在群里发来一串 JSON,让我把里面涨得最好的几只股票名字挑出来。我本来习惯性地打开 Python,敲了十几行循环,写到一半自己笑了——这东西明明一条命令就能搞定。
这个命令叫 jq。今天花点时间把它实测一遍,平时处理接口返回、读配置文件、翻日志的场景,它基本都能接。
先说我测试环境:一台 Linux 机器,装的是 jq 1.6。装起来一行:apt install jq 或者 macOS 上 brew install jq,几秒钟的事。
我造了一份假数据,五只股票,带代码、名称、价格、涨跌幅、所属板块。就是上面说的那个场景。
第一次测试是筛选涨幅为正的股票。以前我用 Python 得写:
import jsonwith open("stocks.json") as f: data = json.load(f)names = [s["name"] for s in data if s["change_pct"] > 0]print(names)
jq 呢?一条:
jq '[.[] | select(.change_pct>0) | .name]' stocks.json
输出直接是合格的 JSON 数组:
["贵州茅台", "宁德时代", "比亚迪"]
真实跑出来的,不是编的。
第二个场景是取跌幅最狠的前三名。Python 得先 sort 再切片,写两行。jq 里 sort + 切片连在一起:
jq 'sort_by(.change_pct) | .[0:3] | .[].name' stocks.json
结果是"中国平安"、"五粮液"、"比亚迪"。
跑了几轮之后我摸清它的脾气。它擅长的是读和查这种纯查询的活。接口返回一大坨 JSON 你要抽几个字段、要过滤、要排序、要统计——这些都是它的一亩三分地,又快又短。
但它也不是万能。凡是涉及复杂逻辑的,它写起来那叫一个费劲。嵌套几层回调、要处理异常、要做运算之外的事,jq 的语法能把你绕晕,这时候老老实实回 Python 更舒服。
我自己定了个简单的分界线:一条命令能写清楚的查询就交给 jq,一超过两行直接上 Python。这条线帮我省掉了很多本可以更快做完的琐事。
jq 用熟之后还有一个反作用,我估计不少人也有:你会开始不自觉地想让接口返回的数据长成好查的样子。为了少写几行 jq,反而逼着自己把上游数据结构设计得干净了,这算是个当初没想到的收获。
工具这东西,不在于多花哨,在于你哪天顺手摸起来就能用。jq 值得花十分钟装上,然后留着,等你哪天真被一坨 JSON 卡住的时候,它会替你省下那一下午。