Python json模块

734 阅读5分钟

玩转Python

这是我参与8月更文挑战的第9天,活动详情查看: 8月更文挑战

回顾复习

我们都知道Python内置库提供了支持序列化和反序列化的模块如下:

  • 对数据以JSON格式进行序列和反序列化-json模块
  • 使用二进制协议来对数据序列和反序列化-pickle模块
  • 对数据进行键值对形式处理-shelve模块

序列化模块

✨我们在pickle模块中知道了序列化和反序列化的基本概念

  • 序列化:将数据以某种协议转成通用格式
  • 反序列化:将数据转换成可阅读的格式

🤔哪为什么要进行序列化?

表面上:方便数据在网络中通信

深层上

我们都是设备之间传输数据通常是TCP/IP协议,我们来看一下发送端和接收端过程

  • 发送端

    (1)TCP/IP协议只支持字节数组的传输,不能直接传对象

    (2)对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。

    (3)所以何种类型的数据,都会以二进制序列的形式在网络上传送。

  • 接收端

    (1)发送方需要把这个对象转换为字节序列,才能在网络上传送;

    (2)接收方则需要把字节序列再恢复为对象。

本次,我们继续学习Python对数据序列和反序列化常用使用的模块-json模块

下雨天☔️,带上耳机🎧、播放音乐🎼,开始今天的学习之旅💃💃💃~

1. JSON格式基本知识

首先我们来看一下,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。

JSON格式的特点:

  • 易于人类阅读和编写的格式
  • 易于机器解析和生成
  • 采用完全独立于语言的文本格式
  • 对象是无序的,格式采用key-value键值对+{}形式
  • 对象与对象之间用逗号隔开,对象与值之间用冒号隔开
  • "{}"用来表达对象,"[]"用来表达数组
  • JSON数据中可以嵌套数组[]等格式

如下是来官网介绍JSON格式示例图:

Json格式示例图

🤪看完JSON格式的特点,我们心中顿时充满疑惑:

JSON格式与字典不是长得一样吗,为啥还会有JSON这玩意?

在python中,字典和JSON非常类似,原因是都是以key-vlaue的形式展示的

  • JSON:是一种数据格式,是纯字符串,可以被解析成python的dict或者其他形式
  • dict: 是一种完整的数据结构,采用hash table来实现的,使用hash函数来进行存储key-value的位置

因此,通过仔细的对比,发现字典dict和JSON它们还是有差异的,如下表格显示差异点:

JSONdict
Key只能是字符串key可以是hash对象(数字、字符串、元组)
key可以是有序、重复的key是不可以重复
key存在默认undefinedkey默认没有默认值
value只能是字符串、浮点数、布尔值或者null,或者构成的数组或者对象value值可以是任何类型的值
访问方式是 [],也可以是 .,遍历方式分为for..invalue仅可以下标访问
字符串强制双引号字符串可以单引号、双引号
可以嵌套只有数组可以嵌套tuple
布尔类型表示:true、false、null布尔类型表示:True、False、None
中文字符串编码是unicode中文字符串编码是utf-8

2. json模块支持的数据格式转换

Python json模块支持Python数据对象和JSON类型互相转换

  1. 支持对数字、字符串、列表、字典和元组数据类型
  2. 通用的序列化格式
  3. 只有很少的一部分数据类型能够通过json转化成字符串

Python数据类型转换成JSON格式

Python数据类型JSON
dictObject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumbers
Truetrue
Falsefalse
Nonenull

JSON格式转换成Python数据类型

JSONPython数据类型
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone

📣重要说明:

  1. Python dict中非字符串的key转化成JSON字符串时都会被转换成小写字符串
  2. Python中tuple,在序列化时会转换成array,但反序列化时,array会被转化为list
  3. 对Python内置的数据类型,json模块可以直接进行序列化和反序列化处理。
  4. 对于自定义的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成object和dict之间进行转换

3. json模块相关方法

json模块提供了对JSON的支持,既包含对JSON字符串恢复成Python数据类型对象的函数,也提供将Python数据类型对象转换成JSON字符串的函数,常用方法如下:

方法作用
json.dump(obj,fp)将对象转化成JSON格式,存入指定文件中
json.dumps(obj)将对象转化成JSON格式的字符串
json.load(fp)从指定文件中json字符串反序列化
json.loads(s)将JSON字符串对象反序列化

PS:json模块的方法与pickle方法相似,只是对数据进行序列化的格式不一样

import json

dict_school={
        'School':'Juejin school',
        'class count':2,
        'class info':
                    {
                        'one class':
                                {
                                    'class name':'Rose class',
                                    'teacher name':'Anne',
                                    'student sum':30
                                },
                        'two class':
                                {
                                    'class name':'Moon class',
                                    'teacher name':'Toney',
                                    'student sum':23
                                }
                    },
        'special':["dance","swimming"],
        'class_teacher':("XiaoMING","ROSEXIAO"),
        'isclassing':True,
        'isleave': None
       }

Js = json.dumps(dict_school)

对字典进行序列/反序列化操作

#对文件进行序列化
with open(r"f:\school_juejin.json","w") as fp:
    ret_dic = json.dump(dict_school,fp)

# 对文件进行反序列化
with open(r"f:\school_juejin.json","r") as fp:
    ret_dic = json.load(fp)
    print("类型:",type(ret_dic))
    print("ret_dic内容:",ret_dic)
    print("查字段:",ret_dic['class info']['one class'].values())

对文件进行反序列化

总结

本期,我们学习了Python对数据进行序列化和反序列化使用最多的模块的json模块

json模块同样也提供了dumps()、dump()函数进行对数据序列化为json格式,load()、loads()函数对json格式对象反序列化操作。

以上是本期内容,欢迎大佬们点赞评论ღ( ´・ᴗ・` )比心,下次见~💖💗💓