json 处理模块
pip install jq https://pypi.python.org/pypi/jq
pip install pyjq https://pypi.python.org/pypi/pyjq
pip install glom https://glom.readthedocs.io/
模块 pyjq
注意:如何处理json string
Q&A
How can I process a json string (f.e. gotten from an API) with pyjq?
You should call json.loads from the standard library on the string, before you pass it to pyjq.
1. 准备数据,如下两种方式等价。
>>> data = dict(
... parameters= [
... dict(name="PKG_TAG_NAME", value="trunk"),
... dict(name="GIT_COMMIT", value="master"),
... dict(name="TRIGGERED_JOB", value="trunk-buildall")
... ],
... id="2013-12-27_00-09-37",
... changeSet=dict(items=[], kind="git"),
... )
>>> data
{'parameters': [{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}], 'id': '2013-12-27_00-09-37', 'changeSet': {'items': [], 'kind': 'git'}}
>>> jdata = dict(parameters= [dict(name="PKG_TAG_NAME", value="trunk"),dict(name="GIT_COMMIT", value="master"),dict(name="TRIGGERED_JOB", value="trunk-buildall")],id="2013-12-27_00-09-37",changeSet=dict(items=[], kind="git"),)
>>> jdata
{'parameters': [{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}], 'id': '2013-12-27_00-09-37', 'changeSet': {'items': [], 'kind': 'git'}}
2. 测试
- 导入pyjq
>>> import pyjq
- 输出整个json
>>> pyjq.first('.',data)
{'parameters': [{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}], 'id': '2013-12-27_00-09-37', 'changeSet': {'items': [], 'kind': 'git'}}
- 输出某个name,范例
id
、chageSet
、chageSet下的子namekind
>>> pyjq.first('.id',data)
'2013-12-27_00-09-37'
>>> pyjq.first('.changeSet',data)
{'items': [], 'kind': 'git'}
>>> pyjq.first('.changeSet.kind',data)
'git'
- 输出数组下的元素
>>> pyjq.first('.parameters',data)
[{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]
>>> pyjq.first('.parameters[]',data)
{'name': 'PKG_TAG_NAME', 'value': 'trunk'}
>>> pyjq.first('.parameters[0]',data)
{'name': 'PKG_TAG_NAME', 'value': 'trunk'}
>>> pyjq.first('.parameters[1]',data)
{'name': 'GIT_COMMIT', 'value': 'master'}
>>> pyjq.first('.parameters[2]',data)
{'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}
- 输出数组下的全部元素的子name
注意:换了.all
方法
>>> pyjq.all('.parameters[] | {"param_name": .name}', data)
[{'param_name': 'PKG_TAG_NAME'}, {'param_name': 'GIT_COMMIT'}, {'param_name': 'TRIGGERED_JOB'}]
>>> pyjq.all('.parameters[] | {"param_type":.type}', data)
[{'param_type': None}, {'param_type': None}, {'param_type': None}]
>>> pyjq.all('.parameters[] | {"param_name": .name, "param_type":.type}', data)
[{'param_name': 'PKG_TAG_NAME', 'param_type': None}, {'param_name': 'GIT_COMMIT', 'param_type': None}, {'param_name': 'TRIGGERED_JOB', 'param_type': None}]
>>> pyjq.all('.id,.parameters[]', data)
['2013-12-27_00-09-37', {'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]
>>> pyjq.all('.id,.parameters[].name', data)
['2013-12-27_00-09-37', 'PKG_TAG_NAME', 'GIT_COMMIT', 'TRIGGERED_JOB']
- 根据某个元素拆解数组
>>> pyjq.all('{id,parameters: .parameters[]}',data)
[{'id': '2013-12-27_00-09-37', 'parameters': {'name': 'PKG_TAG_NAME', 'value': 'trunk'}}, {'id': '2013-12-27_00-09-37', 'parameters': {'name': 'GIT_COMMIT', 'value': 'master'}}, {'id': '2013-12-27_00-09-37', 'parameters': {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}}]
- 根据条件,选择数据中某个元素
>>> pyjq.all('{id,parameters: .parameters[]} | select(.parameters.name == $name)', data, vars={"name":"GIT_COMMIT"})
[{'id': '2013-12-27_00-09-37', 'parameters': {'name': 'GIT_COMMIT', 'value': 'master'}}]
>>> pyjq.all('{id,parameters: .parameters[]} | select(.parameters.name == "GIT_COMMIT")', data)
[{'id': '2013-12-27_00-09-37', 'parameters': {'name': 'GIT_COMMIT', 'value': 'master'}}]
- 打印数组下的某子name的全部内容
注意:有没有
[]
的区别
>>> pyjq.all('.parameters', data)
[[{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]]
>>> pyjq.all('.parameters[]', data)
[{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]
>>> pyjq.all('.parameters[] | {name: .name}', data)
[{'name': 'PKG_TAG_NAME'}, {'name': 'GIT_COMMIT'}, {'name': 'TRIGGERED_JOB'}]
>>> pyjq.all('.parameters[] | {value: .value}', data)
[{'value': 'trunk'}, {'value': 'master'}, {'value': 'trunk-buildall'}]
>>> pyjq.all('.parameters[] | {name: .name,value: .value}', data)
[{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]
3. compile 对象化
>>> data
{'parameters': [{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}], 'id': '2013-12-27_00-09-37', 'changeSet': {'items': [], 'kind': 'git'}}
>>> pat = pyjq.compile('{id, parameters: .parameters[]}')
>>> pat.all(data)
[{'id': '2013-12-27_00-09-37', 'parameters': {'name': 'PKG_TAG_NAME', 'value': 'trunk'}}, {'id': '2013-12-27_00-09-37', 'parameters': {'name': 'GIT_COMMIT', 'value': 'master'}}, {'id': '2013-12-27_00-09-37', 'parameters': {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}}]
>>> pat = pyjq.compile('{id, parameters: .parameters}')
>>> pat.all(data)
[{'id': '2013-12-27_00-09-37', 'parameters': [{'name': 'PKG_TAG_NAME', 'value': 'trunk'}, {'name': 'GIT_COMMIT', 'value': 'master'}, {'name': 'TRIGGERED_JOB', 'value': 'trunk-buildall'}]}]
>>> pat = pyjq.compile('{parametersname: .parameters[].name}')
>>> pat.all(data)
[{'parametersname': 'PKG_TAG_NAME'}, {'parametersname': 'GIT_COMMIT'}, {'parametersname': 'TRIGGERED_JOB'}]
>>>
>>>
>>> pat = pyjq.compile('{id,parametersname: .parameters[].name}')
>>> pat.all(data)
[{'id': '2013-12-27_00-09-37', 'parametersname': 'PKG_TAG_NAME'}, {'id': '2013-12-27_00-09-37', 'parametersname': 'GIT_COMMIT'}, {'id': '2013-12-27_00-09-37', 'parametersname': 'TRIGGERED_JOB'}]
网友评论