自从用了mac后,就渐渐喜欢上了命令行,利用管道,可以把一些基本命令组合在一起,发挥意想不到的效果. 在接口调试中,我常用的是curl工具. 通常返回一串json数据,但有时数据量过大,且返回的json并没有格式化。可用python自带的工具对其进行格式化处理:
curl -XGET 'http://*****' | python -m json.tool
以上命令通过管道将curl的执行结果传递给 json.tool 执行,输出的结果确实起到格式化的作用,但中文可读性全无。
前不久,我想通过shell脚本调用公司的某一接口。前置条件是要通过登陆接口获取token(token是登陆接口返回json中的一个字段)。接口还涉及到base64加密,以及用md5计算摘要。base64 和 md5 在系统中都有现成的工具,唯一烦人的是json的解析。我实在不想用grep,或awk等命令去分析文本,于是我修改了json.tool工具,改善了中文可读性,及添加了路径查找工能,修改后代码如下:
import argparse
import json
import sys
def main():
prog = 'python -m json.tool'
description = ('A simple command line interface for json module '
'to validate and pretty-print JSON objects.')
parser = argparse.ArgumentParser(prog=prog, description=description)
parser.add_argument('infile', nargs='?', type=argparse.FileType(),
help='a JSON file to be validated or pretty-printed')
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
help='write the output of infile to outfile')
parser.add_argument('--sort-keys', action='store_true', default=False,
help='sort the output of dictionaries alphabetically by key')
parser.add_argument('--path',
help='json 对像路径')
options = parser.parse_args()
infile = options.infile or sys.stdin
outfile = options.outfile or sys.stdout
sort_keys = options.sort_keys
path = options.path
with infile:
try:
obj = json.load(infile)
except ValueError as e:
raise SystemExit(e)
obj = parse(obj,path)
with outfile:
if isinstance(obj,str):
outfile.write(obj)
else:
json.dump(obj, outfile, sort_keys=sort_keys, indent=4,ensure_ascii=False)
outfile.write('\n')
def parse(obj,path):
if not path :
return obj
pathArr = path.split(".")
for p in pathArr:
if isinstance(obj,list):
obj = obj[int(p)]
else:
obj = obj[p]
return obj
if __name__ == '__main__':
main()
echo '[{"name":"王志平","dept":"开发部"},{"name":"王","dept":"开发部"}]' | python -m me.json.tool --path 1.name
cat <<EOF | python -m me.json.tool --path roles.1.name
{
"name":"王志平",
"roles":[
{"id":11,"name":"超级管理员"},
{"id":12,"name":"运维"},
{"id":12,"name":"系统管理员"}
]
}
EOF
‘ 路径字符串 roles.1.name 表示:roles属性中第1个对像中属性为name的值
使用效果展示
视频中我利用curl命令从consul中获取配置,再利用我改进后的工具对结果解析,直至获取配置内容,然后用base64 -d 返回解码出的内容。