Python 之 JSON序列化(我不得不说JSON让世界更加美好了)

对于开发出JSON的大佬 ,让我不得不说一句

太强了!

1.相遇

我不想直接上来就说什么书上的概念,我先说说JSON带给了我什么

我通过一个脚本执行得到了一个复杂且元素庞大的列表,我在另外一个脚本中会用到它,所以开始我就想把它保存到一个文件中,再读写,但是list要转为str才能保存到txt文件中。(但是我觉得太麻烦,直接导入模块了,但这不妨碍我喜爱JSON)

我简化一下,给大家演示一下。

#我最终得到了一个列表a
a = list(range(0,10))

# 因为这个要保存的列表里面有数字元素,只有字符能和字符进行拼接
b = [str(i) for i in a] 
str = ""
for i in range(10):
    str = str+ b[i]

with open('data.txt', 'w') as f:
    f.write(str)
with open('data.txt', 'r') as f:
    c = f.read()

# 我最后得到的 d 也是列表
d = [c[i] for i in range(10)]
print(d)

在这里插入图片描述

b = [str(i) for i in a] 

如果这段代码使你感到困惑,请看这篇博客:Python 之 列表推导式

使用JSON

import json
a = list(range(0,10))
with open('data.txt', 'w') as f:
    f.write(json.dumps(a))
with open('data.txt', 'r') as f:
    b = json.loads(f.read())
print(b)

我最后得到的 b 也是列表
在这里插入图片描述
重点是什么

是无论你这数据有多么复杂和奇怪,使用JSON,只需要两行代码!!

2.简介


通常,我们把 程序的各种类型数据对象 变成 表示该数据对象的 字节串 这个过程 称之为 序列化

而把 字节串转化为 程序中的数据对象 这个过程 称之为 反序列化

我们通过任何传输协议 (当前 用的比较多的是 http协议) 传送信息,传输的都是 序列化好的字节串 。

而且 不同的客户端、服务端程序可能使用不同的语言为了方便 不同的编程语言 处理, 这个序列化后的 格式 应该是各种语言都 方便 处理的。


JSON , 英文全称为 JavaScript Object Notation, JS 对象标记 , 是一种轻量级的数据交换格式。它是 javascript 规范里面定义的。 它是一种 文本格式 来存储和表示数据。它的特点就是 简洁 并且 清晰, 人都能很容易的看明白。

任何编程语言都可以使用这种格式。 而且很多编程语言的解释器内置了库,可以很方便的序列化反序列化。 包括 Python、 Javascript 等。

所以当下的主流方案 就是使用 : JSON 格式


3.序列化和反序列化

1)序列化

Python 中内置了 json 这个库,可以 方便的把内置的数据对象 序列化为 json格式文本的字符串。

比如,我们要把下面的数据对象序列化为json格式的字符串,就可以使用该库里面的dumps函数,像这样

import json

club = [

    {
        'City'   : '北京',       # 城市
        'Name'   : '李华',           # 姓名
    },
    {
        'City'   :'上海',       # 城市
        'Name'   :'李华',            # 姓名
    }

]

 dumps 方法将数据对象序列化为 json格式的字符串
jsonstr = json.dumps(club)
print(jsonstr)
print(type(jsonstr))

在这里插入图片描述
中文部分经过json转化变成了编码数字

这是因为 json.dumps 方法发现将字符串中如果有非ascii码字符,比如中文, 缺省就用该字符的unicode数字来表示。

如果你不想这样,可以给参数 ensure_ascii 赋值为 False,如下所示

json.dumps(club, ensure_ascii=False, indent=4)

其中,indent参数表示转换后缩进为4,这样显得整洁好看

在这里插入图片描述
我特意把 jsonstr 的类型打出来,这是一个字符串。

然后我们可以存储到文件,或者从网络发送出去。

这样就完成了数据对象的发送。

2)反序列化

接收方如果也是Python开发的,可以使用 json库中的 loads方法,把json格式的字符串变为 Python中的数据对象

import json

jsonstr = '[{"City": "北京", "Name": "张三"}, {"City": "上海", "Name": "李四"}]'

translist = json.loads(jsonstr)
print(translist)
print(type(translist))

在这里插入图片描述

可以发现,确实转变成为了list对象。

这样接收方程序就可以方便的处理里面的数据了。

4.使用json深度拷贝

1)第一次尝试

这有一个数据对象,我们需要一个和它一模一样的对象来进行操作。但是不能改变原来的数据对象。

club = [
    {
       'City'   : '北京',       
       'Name'   : '李华',           
    },
    {
        'City'   :'上海',       
        'Name'   :'李华',            
    }
]

我们是不能用下面这个方法,因为变量只是一个符号,你一操作就会改变原来的数据对象。

club2 = club
club2[0]['City'] = '深圳'
print(club[0]['City'])

在这里插入图片描述

2)第二次尝试

这个时候你肯定会说,那我创建一个新的列表好了,然后一项一项的加上去

club = [
    {
       'City'   : '北京',
       'Name'   : '李华',
    },
    {
        'City'   :'上海',
        'Name'   :'李华',
    }
]

club2 = []
for i in club:
    club2.append(i)

club2[0]['City'] = '深圳'
print(club[0]['City'])

结果呢
在这里插入图片描述
这是因为,你把club列表中的元素按装顺序放到新的列表中,元素在内存中存放的地址还是一样的。虽然club2是你新创建的,但是

club[0]['City'] 和 club2[0]['City']  指向的地址是一样的。

3)第三次尝试,成功!

club = [
    {
       'City'   : '北京',
       'Name'   : '李华',
    },
    {
        'City'   :'上海',
        'Name'   :'李华',
    }
]

club2 = []
for i in club:
    club2.append({'City':i['City'],'Name':i['Name']})

club2[0]['City'] = '深圳'
print(club[0]['City'])

打个比方,这相当于你拿了同学作业,每一题都复印一次,然后贴到自己暑假作业本上,此时存在的是两本暑假作业。

但是如果这个对象特别复杂呢?

请看下面的代码

import json
club = [
    {
       'City'   : '北京',
       'Name'   : '李华',
    },
    {
        'City'   :'上海',
        'Name'   :'李华',
    }
]

club2 = json.loads(json.dumps(club))

club2[0]['City'] = '深圳'

print(club[0]['City'])


JSON可以处理更复杂的情况!

5.总结

不是说,不用JSON就实现不了,但是选择JSON确实是一种更好的选择!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值