对于开发出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确实是一种更好的选择!