使用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


猜你喜欢
详解 Mysql查询结果顺序按 in() 中ID 的顺序排列
解决MySQL主从数据库没有同步的两种方法
Python 实现文件的全备份和差异备份详解
python3 os进行嵌套操作的实例讲解

javaScript让文本框内的最后一个文字的后面获得焦点实现代码

Python中使用json.load()和json.loads()加载json数据的方法实例
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
python爬取代理IP并进行有效的IP测试实现

如何利用Python监控别人的网站
Python直接赋值、浅拷贝与深度拷贝实例分析

vue3 自定义指令详情
Python ArcPy批量掩膜、重采样大量遥感影像的操作

Python面向对象封装操作案例详解 II

python网络编程之数据传输UDP实例分析
vue.js实现含搜索的多种复选框(附源码)

Python实现Opencv cv2.Canny()边缘检测

OpenCV+Python3.5 简易手势识别的实现

在JavaScript中对HTML进行反转义详解
ORACLE学习笔记-新建用户及建表篇
