Python之序列化与反序列化 || python序列化与反序列化需要注意的几个问题(很重要)

python--序列化与反序列化

前言:

1、序列化(Serialization):将对象的状态信息转换为可以存储可以通过网络传输的过程,传输的格式可以是JSON、XML等。

   反序列化:就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

2、为什么要用json传输数据,这里就要比较两种传输数据的方式:xml和json。它们之间有什么区别呢?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

XML 全称是可扩展标记语言(EXtensible Markup Language),是一种类似与HTML的语言,是被设计用来描述数据的语言,重量级。

JSON和XML的轻/重量级的区别在于:

JSON只提供了整体解析方案,而这种方法只在解析较少的数据时才能起到良好效果;而XML提供了对大规模数据的逐步解析方案,这种方案很适用于对大量数据的处理。

一、简要概述

1.序列化是将数据由内存对象存储在文件中。(把python数据类型转化成str的类型的过程(dict—>str))

2.反序列化是将数据由文件取出变成内存对象(例如dict,list)(把str类型转化成python数据类型的数据结构(str—>dict))

3.json数据的本质是str类型

二、数据格式

如果要将一个系统内的数据通过网络传输给其它系统或客户端,我们通常都需要先把这些数据转化为字符串或字节串,而且需要规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义。XML 是早期被广泛使用的数据交换格式,在早期的系统集成论文中经常可以看到它的身影;如今大家使用更多的数据交换格式是JSON(JavaScript Object Notation),它是一种轻量级的数据交换格式。JSON相对于XML而言,更加加单、易于阅读和编写,同时也易于机器解析和生成。除此之外,我们也可以自定义内部使用的数据交换格式。

三、api使用

1、json.dump():

2、json.dumps():

3.json.load():

json.loads():

四、代码实例

"""
Python3 JSON模块的使用
这里只是介绍最常用的dump、dumps和load、loads
"""

import json

# 自定义了一个简单的数据(Python中的字典类型),要想Python中的字典能够被序列化到json文件中请使用双引号!双引号!双引号!
data_obj = {
    "北京市": {
        "朝阳区": ["三里屯", "望京", "国贸"],
        "海淀区": ["五道口", "学院路", "后厂村"],
        "东城区": ["东直门", "崇文门", "王府井"],
    },
    "上海市": {
        "静安区": [],
        "黄浦区": [],
        "虹口区": [],
    }
}

# ---------------------------------------------------分割线------------------------------------------------------------


"""
dumps:序列化一个对象
sort_keys:根据key排序
indent:以4个空格缩进,输出阅读友好型
ensure_ascii: 可以序列化非ascii码(中文等)

"""
s_dumps = json.dumps(data_obj, sort_keys=True, indent=4, ensure_ascii=False)
print(s_dumps)

# ---------------------------------------------------分割线------------------------------------------------------------


"""
dump:将一个对象序列化存入文件
dump()的第一个参数是要序列化的对象,第二个参数是打开的文件句柄
注意打开文件时加上以UTF-8编码打开

* 运行此文件之后在统计目录下会有一个data.json文件,打开之后就可以看到json类型的文件应该是怎样定义的

"""
with open("data.json", "w", encoding="UTF-8") as f_dump:
    s_dump = json.dump(data_obj, f_dump, ensure_ascii=False)
print(s_dump)

# ---------------------------------------------------分割线------------------------------------------------------------


"""
load:从一个打开的文件句柄加载数据
注意打开文件的编码

"""
with open("data.json", "r", encoding="UTF-8") as f_load:
    r_load = json.load(f_load)
print(r_load)

# ---------------------------------------------------分割线------------------------------------------------------------


"""
loads: 从一个对象加载数据

"""
r_loads = json.loads(s_dumps)
print(r_loads)

arg = '{"bakend": "www.oldboy.org", "record": {"server": "100.1.7.9", "weight": 20, "maxconn": 30}}'

a = json.loads(input('请输入添加的数据:'),encoding='utf-8')
print(a)

python序列化与反序列化需要注意的几个问题(很重要):

1、当python字典类型数据的value中存在布尔类型的值时,例如Ture或者False时,解析为json数据类型时,Ture变为ture。

例如:

 

2、当python字典类型数据的value值中存在空值时,例如""或者''【python数据不区分单引号和双引号】,解析为json数据类型时,变为""。【json字符串数据无论是键或者值统统都是双引号""括起来的,不能使用单引号】。

例如:

 

3、当python字典类型数据的value值中存在None值时【python中独有的,代表空值】,解析为json数据类型时,变为null【注意:此时的json字符串不能通过evel解析为python数据类型】。

例如:

 

4、以上是python的序列化中存在的情况,反之python的反序列化情况相同,反推同样成立。

posted @ 2021-05-13 09:47  习久性成  阅读(426)  评论(0编辑  收藏  举报