Python中高效使用JSON的四个小窍门

发表于:2020-9-15 10:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:读芯术    来源:今日头条

#
Python
分享:
  字典和列表是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} 
  2. JSON编码
  编码JSON也很简单。使用json.dumps(…) 把由字典、列表和其他本机类型组成的Python对象转换为字符串:
  >>> 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 
  } 
  3. 命令行用法
  JSON库也可从命令行使用,以校验、优化JSON:
  $ echo "{ \"name\": \"Monty\", \"age\":45 }" | \ 
  python3 -m json.tool 
  { 
      "name": "Monty", 
      "age": 45 
  }
  如果你的电脑系统是Mac或Linux,并且能够安装JSON库的话,那么你也可以研究一下jq 命令行工具。它除了有便于记忆,可以润色代码等优点外,还有许多其他特点。
jq将在默认情况下优化JSON
  4. 使用JMESPath搜索JSON
  JMESPath是一种JSON查询语言。它能够让你轻松地从JSON文档中获取所需数据。如果你用过JSON,就会觉得获取嵌套值并不难。
  例:doc["person"]["age"]将在一个如下所示的文档中获取age的嵌套值:
  { 
    "persons": { 
      "name": "erik", 
      "age": "38" 
    }} 
  但如果是像下面这样的文档,该如何从这一组人名中提取所有年龄字段呢?
  { 
    "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] 
  >>> 
  现在就去试一试吧!请严格按照交互式教程操作,同时也不要忘了在JMESPath站点上查看示例哦!

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号