是不是一直傻傻分不清楚dumps、dump、loads和load的关系,长痛不如短痛,今天索性就把它写明白,不懂得朋友,请看下面。

这里我先回答一个很常见的问题,为什么 Python 会有四个操作 Json 的函数?按理说应该就只有两个的,一个解码,一个编码。

首先 Json 是一种数据格式,文件通常是以.json作为后缀,这种结构在互联网很是常见和方便。Python 这么牛逼,也想添加这个结构性的数据,所以 dict字典数据类型就这么来了, dict 也是键和键值的结构,和 Json 几乎一致。

但是问题了,Json 文件这么的流行,Python 也需要支持 Json文件的读取和写入的,所以json.load()和json.dump(),就这么被设计出来了。

但是随着Python爬虫的兴起,越来越多的 Python 爬虫需要处理网站抓取的 json 数据,进行处理转换为 Python 字典类型,但是现有的 load 和 dump 并不能解决这样的问题,所以此时 json.loads()和json.dumps() 隆重登场。

详细的介绍请看下方:

1、json.dumps()

import json

dict1 = {

'name': '西园公子',

'salary': '66666',

}

json_str = json.dumps(dict1) # 将字典格式 dict1 转为 Json 格式的字符串

print(f"json_str:{json_str}, json_str_type:{type(json_str)}")

# json_str:{"name": "\u897f\u56ed\u516c\u5b50", "salary": "66666"}, json_str_type:

可能你会疑惑了,这个 dumps 貌似也没啥用,只是将 dict 转为 json格式的字符串。这里面一般有两个用处:

1、web后端和前端之间进行 json 数据的传输,Python 在后端就需要将字典转换成通用的 Json 格式 ,以便于前端对数据进行 Json 解码。另外在爬虫中也是常见

2、可以直接复制上面的 json_str 内容,直接新建一个以 .json 后缀的文件,将内容写入,就可生成一个 Json 文件,如果是这种用途的话可直接使用 json.dump(dict_data, fp) 一步到位。

细心的你会发现,我上面写的 dict1 中的键和键值,都是以单引号'进行包裹的,而在 json_str 中则是以双引号"。这是因为标准的 Json 文件语法中是以双引号包裹字符串的。

2、 json.loads()

对于一个 Json 数据,想转成 dict 类型,就需要用 json.loads(json_str), json字符串→ python对象(dict)。

import json

json_str2 = '{"name": "\u897f\u56ed\u516c\u5b50", "salary": "66666"}'

dict2 = json.loads(json_str2)

print(f"dict2:{dict2}, dict2_type:{type(dict2)}")

# 打印

# dict2:{'name': '西园公子', 'salary': '66666'}, dict2_type:

用处:主要用于解码,网络上的 Json 数据,然后转成 Python 的 dict 字典类型,爬虫网络居多。

在网络爬虫中,爬取的网页数据中的一些json数据含有大量的特殊字符串,如果使用 Replace 进行替换的话,效率很低,而且转字典时候,有很多错误。所以需要去除特殊字符串的库,import html

import requests

import html

live_page_html = requests.get(live_content_url, headers=headers, cookies=cookies).text

json_data = html.unescape(live_page_html)

3、json.dump()

参数名

解释

obj

字典

fp

文件句柄

ensure_ascii

设置为False的话,数据会原样写入,设置为True则会编码成ASCII值,其中中文则是编码成 Unicode 值,类似’\xXX\xXX’这种

indent

缩进的空格数,设置为非零值时,一般设置4,比较美观

将字典数据写入 json 文件中:

import json

data = {

'name': '西园公子',

}

with open('data.json', 'w') as f:

json.dump(data, f, ensure_ascii=False, indent=4)

# indent=4是默认以四行缩进,更美观

# ensure_ascii=False 表示

# 注意:json.dump()写入的数据不能是bytes类型,否则会报错

用处:将字典转换并写入到 Json 文件中,已达到生成本地 Json 文件的作用。

4、json.load()

用于读取本地 Json 文件的数据,将其转成 Python 的字典dict类型。

import json

with open('data.json', 'r') as f:

data_dict = json.load(f)

print(f"data_dict:{data_dict},type:{type(data_dict)}")

# 打印

# data_dict:{'name': '西园公子', 'salary': '66666'},type:dict

用处:读取本地 Json 文件中的数据,将数据转换为 Python 的字典格式,供其他函数调用。

总结:

说一下怎么区别这几个函数,按需求来:

如果你是想对本地的一个以 .json 为后缀的 Json 文件,进行读取或者写入的话,那么就用 json.load() 和 json.dump() 。

如果你想将网络上的 Json格式的数据,转为 Python 字典 dict格式 ,又或者是前端和后端之间进行 Json 数据的额传输,那么就需要使用 json.dumps() 和 json.loads()

另外也可以这样记(纯属自己为了好记而虚构的),Python 最先支持对 Json 文件的读取和写入,所以开发出 load、dump,但是后来随着爬虫的火爆,以及 Django、Flask 等框架的兴起,就必须要支持解析 web 端的 Json 数,但是已经有 load 和 dump 了,名字被占用了怎么办?就索性在后面加个 s ,就诞生了 json.dumps() 和 json.loads()。

至于怎么区别 load 和 dump ?就需要理解他的英文单词的意思了。load 是加载的意思,将 json 数据转为 Python 字典格式。 dump是倾倒的意思,将 Python 字典格式转为 Json 格式。

或者看下面的流程图:

总结:

另外关于 load和dump还有很多高级的用法,这边并没有涉及,后面有机会会单独写一篇,下期再见~

python json数组解析_Python基础系列(一)搞懂json数据解析与字典之间的关系相关推荐

  1. python面试文件操作_python基础-三分钟搞定面试官爱问的【文件操作】

    一.使用python读写文本文件 使用Python来读或者写文本需要用到'open'这个关键字,它的作用是打开一个文件并创建一个文件对象. open语法结构: open(file, mode='r', ...

  2. 大数据入门基础系列之初步认识大数据生态系统圈(博主推荐)

    不多说,直接上干货! 之前在微信公众平台里写过 大数据入门基础系列之初步认识hadoop生态系统圈 http://mp.weixin.qq.com/s/KE09U5AbFnEdwht44FGrOA 大 ...

  3. 十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)

    好记性不如烂笔头,相信我,看了之后你会彻底搞懂JSON 前言:前天被JSON对象,JSON字符串,JAVA对象搞混了,不知道各自代表的意思,我就查了资料,总结为一篇博文. 另外我想List<Us ...

  4. 一文搞懂JSON.stringify和JSON.parse(五)JSON.parse使用说明

    一 JSON.parse特性 JSON.parse()就是将JSON字符串解析成字符串描述的JavaScript值或对象(将JSON数据解析为js原生值),例如: JSON.parse('{}'); ...

  5. 求python一个类与对象的代码_Python基础系列(五)类和对象,让你更懂你的python代码...

    首先,非常感谢各位打开本博文,本博文是Python入门基础系列文章之一,Python目前是非常火的编程工具,其实作为编程不在只是程序员的专利,每一个人在日常的工作中.学习中都会或多或少的要用到一些工具 ...

  6. python解析json文件案例_Python加载带有注释的Json文件实例

    由于json文件不支持注释,所以如果在json文件中标记了注释,则使用python中的json.dump()无法加载该json文件. 本文旨在解决当定义"//"为json注释时,如 ...

  7. python组合和继承_Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是"类"和"实例"的关系,另一个是"父类"和"子类 ...

  8. python 神经网络编程 视频_python基础教程之达叔系列——神经网络编程基础|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ (1)二分类问题 目标:习得一个分类器,它以图片的特征向量作为输入,然后预测出结果 y 为 1 还是 0 ...

  9. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

最新文章

  1. 智能指针和内存管理小结
  2. Oracle数据库分组排序
  3. 基于 Node.js 平台的web开发框架-----express
  4. mysql 小数点后几位不足补0初始化
  5. 学习office add-in
  6. 数据库不停机导数据方案_如何计算数据停机成本
  7. 389 find the difference
  8. 启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  9. LeetCode刷题笔记-回溯法-分割回文串
  10. idea 搭建flutter 安卓开发环境(因为有idea就不需安装Android Studio)
  11. wdr7660虚拟服务器设置,TP-Link TL-WDR7660无线桥接怎么设置?
  12. android相关素材以及网站
  13. [因果推断] 增益模型(Uplift Model)介绍(三)
  14. 会java 学c_先学Java再学c会简单点吗?
  15. 金融相关计算机面试题,银行及其他金融企业笔试和面试经验
  16. 软件工程 | 第六章 系统集成与测试
  17. 什么是库尼乌斯(the Cuneus)
  18. 结合泛函极值_泛函极值及变分法讲义.doc
  19. C#调用系统蜂鸣,警报声
  20. win7之下魔兽不能全屏

热门文章

  1. RuoYi-Cloud-Plus 数据权限
  2. python中logger_Python实现Logger打印功能的方法详解
  3. kooboo中axios的探索之路
  4. 2022大厂高频软件测试面试真题(附答案)
  5. 深度解析:mPaaS 3.0全新组件 1
  6. pythoc_autocad_标注_all_圆_半径直径
  7. neo4j安装调研简介-代做找我
  8. RGB-D图像(深度图像)的Surface编码
  9. 微信小程序(小游戏)后台开发
  10. 去哪儿网被曝卖假保险 回应:系统故障所致