使用python解析json字段的3种方式实例

作者:H.S.T不想卷 时间:2021-12-24 04:16:27 

1、运用re、json、jsonpath包解析json思路

(1)re:正则表达式,通过json的形式对症下药,写表达式去解析json;

(2)json: 通过json中的json.loads()方法,将str类型转为dict类型,运用python字典的数据结构特点去解析json;

(3)jsonpath:对比与json包,jsonpath可以根据路径去解析json,比较适合用来解析json中带“[ ]”的数据。

2、三种方式的json解析案例

#json数据样式,本文采用带[]的数据样式
{
   "version": "version 1.0.12",
   "result": {
       "pages": 1314,
       "data": [
           {
               "name": "大明",
               "IDcard": "440588190001015688",
               "address": "广东省广州市天河区正佳广场99楼520号",
           },
           {
               "name": "二明",
               "IDcard": "440588190012317456",
               "address": "广东省广州市天河区天环广场88楼520号",
           }
       ]
   }
}

(1)运用re正则表达式解析json

import re
jsondata={
   "version": "23231cimesfedkk",
   "result": {
       "pages": 1314,
       "data": [
           {
               "name": "大明",
               "IDcard": "440588190001015688",
               "address": "广东省广州市天河区正佳广场99楼520号",
           },
           {
               "name": "二明",
               "IDcard": "440588190012317456",
               "address": "广东省广州市天河区天环广场88楼520号",
           }
       ]
   }
}

if __name__ == '__main__':
   name_list=re.findall(r"'name': '(\w*)'",str(jsondata))
   IDcard_list=re.findall(r"'IDcard': '(\w{18})'", str(jsondata))#身份证18位数字和字母组合
   address_list=re.findall(r"'address': '(\w*)'", str(jsondata))#地址
   print(name_list)
   print(IDcard_list)
   print(address_list)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

(2)运用字典的数据结构性质解析json

import json
jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "广东省广州市天河区正佳广场99楼520号",},{"name": "二明","IDcard": "440588190012317456","address": "广东省广州市天河区天环广场88楼520号",}]}}
if __name__ == '__main__':
   # 若传入的数据为str类型需要将它转成dict类型
   # result = json.loads(jsondata)
   jsondata = jsondata["result"]["data"]
   resultdata = jsondata
   namelist=[]
   idcardlist=[]
   addresslist=[]
   for data in resultdata:
       namelist.append(data['name'])
       idcardlist.append(data['IDcard'])
       addresslist.append(data['address'])
   print(namelist)
   print(idcardlist)
   print(addresslist)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

(3)运用jsonpath的路径解析json

import jsonpath

jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "广东省广州市天河区正佳广场99楼520号",},{"name": "二明","IDcard": "440588190012317456","address": "广东省广州市天河区天环广场88楼520号",}]}}
if __name__ == '__main__':
   namelist=[]
   idcardlist=[]
   addresslist=[]
   #运用jsonpath.jsonpath(字典数据, 路径)
   namelist=jsonpath.jsonpath(jsondata, '$..name')
   idcardlist=jsonpath.jsonpath(jsondata, '$..IDcard')
   addresslist=jsonpath.jsonpath(jsondata, '$..address')
   print(namelist)
   print(idcardlist)
   print(addresslist)

运行结果:

['大明', '二明']
['440588190001015688', '440588190012317456']
['广东省广州市天河区正佳广场99楼520号', '广东省广州市天河区天环广场88楼520号']

3、附录:re正则表达式语法

使用python解析json字段的3种方式实例

附:python 处理非标准 json 格式字符串

在写爬虫的时候,会发现很多数据都是通过 json 格式进行传输的,标准的 json 我们可以将其转化为 Python 中的数据类型,进行查询,但对于一些类似于 json 但又非标准 json 格式的字符,就会比较头疼了,这里统计一些咱遇到的非标准的 json 格式,及相应的解析方法。

字符串中 key 的值没有被单引号包裹

使用python解析json字段的3种方式实例

类似于这种字符,看上去格式和 json 很像(眼尖的朋友可能发现了,这是 qq 的数据 嘿嘿),但仔细观察会发现,这其中的 key 没有被单引号包裹起来,这就导致了它无法被简单的解析为字典类型,因为解析的时候 key 会被解析成相应的变量而非字符,这些变量又都没有定义,所以会报错。

那怎么办呢?咱的第一反应是利用正则去人为构造成标准的格式,不过这个难度系数有点大,对正则的要求挺高,还费脑子,明显不符合咱的风格。于是咱就去网上找了一下,有没有现成的方法,还真有呢:

使用 demjson

首先安装 demjson

pip install demjson
s = '{suggestion:[{query:"London",interpretation: \'abc\'}]}'
dict1 = demjson.decode(s)
print(dict1)
{'suggestion': [{'interpretation': 'abc', 'query': 'London'}]}

来源:https://blog.csdn.net/weixin_44894162/article/details/124102811

标签:python,解析,json
0
投稿

猜你喜欢

  • CentOS 6.3安装配置nginx+php+mysql

    2023-11-24 11:11:33
  • Python实现智慧校园自动评教全新版

    2023-02-17 05:04:41
  • pycharm开发一个简单界面和通用mvc模板(操作方法图解)

    2022-10-09 06:28:39
  • 解决python3 中的np.load编码问题

    2021-12-19 20:28:27
  • bootstrap响应式工具使用详解

    2023-08-07 18:14:35
  • pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]

    2023-04-19 20:18:21
  • python中heapq堆排算法的实现

    2022-10-13 23:11:40
  • 使用python检查yaml配置文件是否符合要求

    2021-06-23 05:27:53
  • python 实现在Excel末尾增加新行

    2023-11-26 09:27:52
  • Python GUI自动化实现绕过验证码登录

    2023-06-25 05:18:25
  • Python编程给numpy矩阵添加一列方法示例

    2023-08-29 07:22:30
  • Python使用5行代码批量做小姐姐的素描图

    2023-09-27 09:53:04
  • python 使用元类type创建类

    2021-06-27 21:11:48
  • Scrapy框架爬取Boss直聘网Python职位信息的源码

    2022-06-30 21:02:47
  • 使用 Python 在京东上抢口罩的思路详解

    2023-06-01 01:10:30
  • asp如何对多个条件进行判断?

    2009-11-20 18:28:00
  • IE在DOM操作有表单控件时的bug

    2008-08-21 13:00:00
  • asp textarea 多行数组分割处理方法

    2011-03-03 10:55:00
  • python paramiko实现ssh远程访问的方法

    2021-07-17 23:03:55
  • 基于python图书馆管理系统设计实例详解

    2023-06-28 23:44:13
  • asp之家 网络编程 m.aspxhome.com