python 获取json中最大值_Python中高效使用JSON的四个小窍门

字典和列表是Python的两种数据类型,也是用来处理JSON的完美工具。本文将主要分享以下内容:

·如何载入、编写JSON?

·如何在命令行上优化、校验JSON?

·如何通过使用JMESPath对JSON文档执行高级查询?

1. JSON解码

  Python自带一个功能强大、内容丰富的JSON库。可通过以下方式导入:

import json

  解码JSON字符串很简单,直接输入 json.loads(…) 即可。它可以转换成:

·字典对象

·列表数组

·识别布尔值、整数、浮点数和字符串,在Python中进行正确转换。

·任何 null 都将被转换为Python的None类型。

  以下为json.loads 的一个实例:

>>> import json   >>> jsonstring = '{"name": "erik","age": 38, "married": true}'   >>> json.loads(jsonstring){'name': 'erik', 'age': 38, 'married': True}
>>> import json   >>> jsonstring = '{"name": "erik","age": 38, "married": true}'   >>> json.loads(jsonstring){'name': 'erik', 'age': 38, 'married': True}
>>> import json   >>> jsonstring = '{"name": "erik","age": 38, "married": true}'   >>> json.loads(jsonstring){'name': 'erik', 'age': 38, 'married': True}

2. JSON编码

  编码JSON也很简单。使用json.dumps(…) 把由字典、列表和其他本机类型组成的Python对象转换为字符串:

>>> myjson = {'name': 'erik', 'age': 38, 'married': True}   >>> json.dumps(myjson)'{"name": "erik", "age": 38, "married":true}'
>>> myjson = {'name': 'erik', 'age': 38, 'married': True}   >>> json.dumps(myjson)'{"name": "erik", "age": 38, "married":true}'

  这其实是一个完全相同的文档,只是被转换成了字符串。所以,要想让JSON文档更易读,可使用缩进选项:

>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }
>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }
>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }
>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }
>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }
>>> print(json.dumps(myjson, indent=2))   {    "name": "erik",    "age": 38,    "married": true   }

3. 命令行用法

  JSON库也可从命令行使用,以校验、优化JSON:

$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }
$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }
$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }
$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }
$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }
$ echo "{ "name": "Monty", "age":45 }" |   python3 -m json.tool   {    "name": "Monty",    "age": 45   }

  如果你的电脑系统是Mac或Linux,并且能够安装JSON库的话,那么你也可以研究一下jq 命令行工具。它除了有便于记忆,可以润色代码等优点外,还有许多其他特点。

0f55a197314eda05ca4b1a99dcf08d0e.png

jq将在默认情况下优化JSON

  4. 使用JMESPath搜索JSON

677ed6ba7f280c4cc13f838df3a545a0.png

  JMESPath是一种JSON查询语言。它能够让你轻松地从JSON文档中获取所需数据。如果你用过JSON,就会觉得获取嵌套值并不难。

  例:doc["person"]["age"]将在一个如下所示的文档中获取age的嵌套值:

{    "persons": {    "name": "erik",    "age": "38"    }}
{    "persons": {    "name": "erik",    "age": "38"    }}
{    "persons": {    "name": "erik",    "age": "38"    }}
{    "persons": {    "name": "erik",    "age": "38"    }}
{    "persons": {    "name": "erik",    "age": "38"    }}

  但如果是像下面这样的文档,该如何从这一组人名中提取所有年龄字段呢?

{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}
{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}
{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}
{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}
{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}
{    "persons": [    { "name": "erik","age": 38 },    { "name": "john","age": 45 },    { "name": "rob","age": 14 }    ]}

  我们可以简单地写一套关于这些人名的重复指令。虽然很容易,但重复指令运行较慢,会使你的代码复杂化。所以,这就该派JMESPath上场了!

  用JMESPath表达式编写代码:

persons[*].age

  它将返回一个包含所有年龄的数组:[38, 45, 14].

  假设要筛选列表,只获取名为“erik”的人的年龄。你可以编写一个筛选程序来执行此操作:

persons[?name=='erik'].age

  看,多么流畅!

  因为JMESPath不属于Python标准库,所以你需要一起安装pip或pipenv。例如,在虚拟环境中使用pip:

$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>
$ pip3 install jmespath   $ python3Python 3.8.2 (default, Jul 16 2020, 14:00:26)   >>> import jmespath   >>> j = { "people": [{ "name": "erik","age": 38 }] }   >>> jmespath.search("people[*].age", j)   [38]   >>>

  现在就去试一试吧!请严格按照交互式教程操作,同时也不要忘了在JMESPath站点上查看示例哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值