美文网首页
python 中的 json 处理 - pyjq

python 中的 json 处理 - pyjq

作者: 偷油考拉 | 来源:发表于2021-11-30 15:31 被阅读0次

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. 测试
  1. 导入pyjq
>>> import pyjq
  1. 输出整个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'}}
  1. 输出某个name,范例 idchageSet 、chageSet下的子name kind
>>> pyjq.first('.id',data)
'2013-12-27_00-09-37'

>>> pyjq.first('.changeSet',data)
{'items': [], 'kind': 'git'}

>>> pyjq.first('.changeSet.kind',data)
'git'
  1. 输出数组下的元素
>>> 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'}
  1. 输出数组下的全部元素的子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']

  1. 根据某个元素拆解数组
>>> 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'}}]
  1. 根据条件,选择数据中某个元素
>>> 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'}}]
  1. 打印数组下的某子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'}]

相关文章

网友评论

      本文标题:python 中的 json 处理 - pyjq

      本文链接:https://www.haomeiwen.com/subject/ygintrtx.html