资讯专栏INFORMATION COLUMN

如何使用python提取JSON数据指定内容

89542767 / 2220人阅读

  python作为一种比较常见的编程语言,其应用的范围还是比较的广泛的,主要讲解的内容是如何使用python提取JSON数据指定内容,需要我们好好的去进行一个实操。那么,怎么样快速的才能够上手这项技能呢?下面小编给大家详细解答下。


  如何提取JSON数据指定内容


  假设我们要获取'pic_str'里的数据


  JSON数据

</>复制代码

  1.   {'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}


  1、JSON数据为字符串类型


</>复制代码

  1.   import json
  2.   str="{'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}"
  3.   json_str=str.replace("'",'"')
  4.   #json.loads(),要求json串格式中必须的双引号!!转换为字典
  5.   json_dict=json.loads(dict2)
  6.   print(json_dict['pic_str'])
  7.   &gt;&gt;xoet


  2、JSON数据为字典类型


</>复制代码

  1.   import json
  2.   json_dict={'err_no':0,'err_str':'OK','pic_id':'1169213517976400008','pic_str':'xoet','md5':'ca9bc4fda521498d2b3aba5dbb4ee4ac'}
  3.   #方法一
  4.   print(json_dict['pic_str'])
  5.   #或者使用print(json_dict.get('pic_str'))
  6.   #方法二:遍历
  7.   for pic in json_dict['pic_str'}:
  8.   print(pic)


  如何提取复杂JSON的数据


  在越来越多的项目中,基本都用了json作为接口数据返回的格式。json给我们的感觉就是通俗易懂,只是即使再复杂的结构也会比其他格式容易看。然而一旦在调试或者测试中需要用到提取某一部分字段数据进行解析并校验的话,就没那么容易了。这篇文章使用python简单地获取到复杂json数据中的字段信息。


  例子


  如果有一个接口返回的json信息如下:


</>复制代码

  1.   {
  2.   "familyName":"thinker family",
  3.   "homeTown":"广东省",
  4.   "formed":2016,
  5.   "secretBase":"Super city",
  6.   "active":true,
  7.   "familyMembers":[
  8.   {
  9.   "name":"Jobs",
  10.   "age":35,
  11.   "secretIdentity":"1992238132345",
  12.   "powers":[
  13.   "Radiation resistance",
  14.   "Turning tiny",
  15.   "Radiation blast"
  16.   ]
  17.   },
  18.   {
  19.   "name":"James",
  20.   "age":37,
  21.   "secretIdentity":"8839394098124",
  22.   "powers":[
  23.   "Million tonne punch",
  24.   "Damage resistance",
  25.   "Superhuman reflexes"
  26.   ]
  27.   }
  28.   ]
  29.   }


  这里就包含了对象,以及列表数据。对象中也包含列表数据。这应该是最基本的企业接口json格式了。


  假如你要提取json中的name信息,最简单的方式就是


</>复制代码

  1.   member=[members.get('name')for members in data.get('familyMembers')]

  如果是要连续拿其他的信息,那么就需要换其他中获取方式,其实这种是比较麻烦的一种方法。


  解决方法


</>复制代码

  1.   extract_element_from_json(data,["familyMembers","name"])
  2.   &gt;&gt;['Jobs','James']


  此函数根据path中指定的键嵌套到obj中的记录中以检索所需的信息。当遇到一个列表作为path中键的值时,此函数会拆分并以深度优先的方式继续嵌套在遇到的列表的每个元素上。这就是返回['Jobs','James']的方式;因为familyMembers的值是一个列表,所以嵌套在它的两个元素上被拆分,并且name的每个值都附加到输出列表中。


  如果obj是单个字典/json,则此函数返回包含所需信息的列表,如果obj是字典/json列表,则此函数返回包含所需信息的双重列表。


  如果嵌套字典/json的相应级别缺少path的元素,则此函数返回[None]。


  完整代码如下:


</>复制代码

  1.   def extract_element_from_json(obj,path):
  2.   '''
  3.   输入关键字,就可以将关键字的值信息存放在列表中并输出
  4.   如果关键字是对象名,则返回的对象字典信息到列表中
  5.   如果关键字是列表名,则返回的列表信息到列表中(返回双重列表)
  6.   '''
  7.   def extract(obj,path,ind,arr):
  8.   '''
  9.   从一个嵌套的字典中提取一个元素,并返回到列表中。
  10.   params:obj-dict-输入字典
  11.   params:path-list-构成JSON路径的字符串列表
  12.   params:ind-int-起始索引
  13.   params:arr-列表-输出列表
  14.   '''
  15.   key=path[ind]
  16.   if ind+1&lt;len(path):
  17.   if isinstance(obj,dict):
  18.   if key in obj.keys():
  19.   extract(obj.get(key),path,ind+1,arr)
  20.   else:
  21.   arr.append(None)
  22.   elif isinstance(obj,list):
  23.   if not obj:
  24.   arr.append(None)
  25.   else:
  26.   for item in obj:
  27.   extract(item,path,ind,arr)
  28.   else:
  29.   arr.append(None)
  30.   if ind+1==len(path):
  31.   if isinstance(obj,list):
  32.   if not obj:
  33.   arr.append(None)
  34.   else:
  35.   for item in obj:
  36.   arr.append(item.get(key,None))
  37.   elif isinstance(obj,dict):
  38.   arr.append(obj.get(key,None))
  39.   else:
  40.   arr.append(None)
  41.   return arr
  42.   if isinstance(obj,dict):
  43.   return extract(obj,path,0,[])
  44.   elif isinstance(obj,list):
  45.   outer_arr=[]
  46.   for item in obj:
  47.   outer_arr.append(extract(item,path,0,[]))
  48.   return outer_arr

  这段代码可以直接复制使用。


  其中使用方法很简单如下:

</>复制代码

  1.   extract_element_from_json(data,["familyMembers","name"])


  api提取元素


</>复制代码

  1.   import requests
  2.   url="http://ip-api.com/json"
  3.   response=requests.request("GET",url)
  4.   data=response.json()
  5.   extract_element_from_json(data,["status"])


  就是这么简单地使用了。


  应用场景


  通过这样的方式可以在什么场景下使用呢?


  接口重构,需要校验接口中的部分字段数据


  接口新增字段,只针对新增的字段进行提取校验


  需要提取某一部分字段进行数据传递


  这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128294.html

相关文章

  • Python爬虫笔记5-JSON格式数据提取和保存

    摘要:如下运行结果小黑此外,如果需要将数据保存为文本的时候,还需要指定文件的编码格式为,比如将上面的数据里面有中文字符保存为文件,代码如下否则打开保存的文件,会有乱码。 环境:python-3.6.5 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场...

    ztyzz 评论0 收藏0
  • Python3网络爬虫实战---31、数据存储:文件存储

    摘要:如果该文件已存在,文件指针将会放在文件的结尾。运行结果以上是读取文件的方法。为了输出中文,我们还需要指定一个参数为,另外规定文件输出的编码。 上一篇文章:Python3网络爬虫实战---30、解析库的使用:PyQuery下一篇文章:Python3网络爬虫实战---32、数据存储:关系型数据库存储:MySQL 我们用解析器解析出数据之后,接下来的一步就是对数据进行存储了,保存的形式可以...

    dreamans 评论0 收藏0
  • 另类爬虫:从PDF文件中爬取表格数据

    摘要:本文将展示如何利用的模块从文件中爬取表格数据。但如何从文件中提取其中的表格,这却是一个大难题。我们以输出文件为例从文件中提取表格将表格数据转化为文件得到的文件如下例在例中,我们将提取页面中的某一区域的表格的数据。 简介   本文将展示一个稍微不一样点的爬虫。  以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取...

    Anchorer 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • python---网络基础(socket)

    摘要:套接字有两种或者称为有两个种族分别是基于文件型的和基于网络型的。大部分网络设备的都是。不会发生黏包,用户数据报协议是无连接的,面向消息的,提供高效率服务。即面向消息的通信是有消息保护边界的。 软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器...

    Dr_Noooo 评论0 收藏0

发表评论

0条评论

89542767

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<