使用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 格式字符串
在写爬虫的时候,会发现很多数据都是通过 json 格式进行传输的,标准的 json 我们可以将其转化为 Python 中的数据类型,进行查询,但对于一些类似于 json 但又非标准 json 格式的字符,就会比较头疼了,这里统计一些咱遇到的非标准的 json 格式,及相应的解析方法。
字符串中 key 的值没有被单引号包裹
类似于这种字符,看上去格式和 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


猜你喜欢
- 代码import imutilsimport cv2image = cv2.imread('') # translate t
- 最近在做一个金额查询,验证的时候总是出现很多问题,如输入-号后,input框里是没有了,但是在model里还是绑定了,提交的时候就会报错,真
- 1、处理列表的部分元素称之为切片,创建切片,可指定要使用的第一个元素和最后一个元素的索引。2、这让Python创建一个始于第一个元素,终止于
- IE的特殊性 IE的DOM元素属性与Firefox, Opera, Safari有些不同。在IE中,我们可以给DOM添加任意自定
- 无论安装何版本的mysql,在管理工具的服务中启动mysql服务时都会在中途报错。内容为:在 本地计算机 无法启动mysql服务 错误106
- 安装anaconda后查询CPU版本时打开Anaconda Prompt输入python然后输入import tensorflow as t
- 主键表的主键(primary key,主关键字)是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录。一个表不能有多个主关键字,并且
- php统计数组元素个数count():对数组中的元素个数进行统计;sizeof():和count()具有同样的用途,这两个函数都可以返回数组
- 一、简介项目中用到了MySQL,参考网上的例子做了安装和基本使用,本文简单的介绍一下。二、环境准备操作系统:Win10三、教程1、下载安装包
- NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes
- InstrRev描述:返回某字符串在另一个字符串中出现的从结尾计起的位置。语法:InstrRev(string1, string2
- 我就废话不多说了,大家还是直接看代码吧~注释讲解版:# Classifier exampleimport numpy as np# for
- Python实现对网易云音乐的数据进行一个数据清洗和可视化分析对音乐数据进行数据清洗与可视化分析关于数据的清洗,实际上在上一一篇文章关于抓取
- MyBatis-Plus实现数据库curd操作1.mp是什么MyBatis-Plus(简称MP)是一个MyBatis 的增强工具,在MyBa
- 需求需要向大约 500 名用户发送带有 Excel 附件的电子邮件,同时必须按用户从主 Excel 文件中拆分数据以创建他们自己的特定文件,
- Python中可以用docx来生成word文档,docx中可以自定义文字的大小和字体等。其中要整体修改文字的字体大小和字体,可以用以下方法:
- 本文实例为大家分享了GO原生实现文件上传功能的具体代码,供大家参考,具体内容如下写在前面最近在学习go,发现实践才是检验真理的唯一标准。在不
- 数据结构:通俗点说,就是储存大量数据的容器。这里主要介绍Python的4种基本数据结构:列表、字典、元组、集合。格式如下:列表:list =
- 本文简介前段时间,黄同学写了一篇《MySQL窗口实战》文章(文章如下),但是里面大多数是以实战练习为主,没有做详细的解释。传送门:MySQL
- 在设计中保持一致性(uniformity)是网页设计中一个重要的组成部分,它能使你的设计有效地传达信息而不会导致用户迷惑或焦虑。保证一致性的