、什么是数据交换格式?
就像人类需要通过交流互相合作,计算机网络中的各个计算机之间的相互合作也依赖于彼此的信息交互。人类之间的互相交流可以通过电话、短信、文字等实现,但这些都建立在交流的双方使用共通的语言基础上。而计算机可以以通过TCP等方式传输数据,但我们需要预定义一种为双方计算机所接受的共同“语言”,我们称之为“数据交换语言”。
在不同的系统不同的语言间交换数据时,我们一般倾向于使用无关平台及语言的数据交换格式,包括XML、JSON、YAML等,常用于接口调用、配置文件、数据存储等场景。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。
二、JSON语法
JSON语法只支持字符串、数值、布尔值及null以及在此基础上的对象和数组。
1、对象(object)
对象是一个无序的“键-值”集合。一个对象以“{”(左大括号)开始,“}”(右大括号)结束。每一个“键”后跟一个“:”,“键-值”对之间使用“,”分隔。(这里像极了Python里的字典啊!)
2、数组(array)
数组是值(value)的有序集合。一个数组以“[”(左方括号)开始,“]”(右方括号)结束。每一个值之间使用“,”分隔。(这就是Python里的列表啊!)
3、值(value)
值可以是双引号括起来的字符串、数值、布尔值(true、false)、null、对象(object)或者数组(array)。这些结构可以嵌套。
举例一个JSON数据对象:
{
"firstName": "John"
"lastName": "Smith",
"sex": "male"
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York"
}
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
三、数据序列化json模块
数据序列化:用于模块通信时,将对象序列化为通信流,高效的传输到另一个模块,并提供反序列化还原数据。
Python中的json模块,主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同事也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互。
json模块提供了四个函数:dumps、dump、loads、load。
Python编码为JSON类型转换对应表:
JSON编码为Python类型转换对应表:
1、dumps和loads用于Python对象和字符串间的序列化和反序列化
dumps:将Python基本数据类型转化为json格式数据类型
loads:将json格式数据类型转化为Python数据类型
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import json
s1 = '{"key1": "value1"}' #字符串只能是这个格式的,才能被json转换 通过loads进行反序列化时,必须使用双引号
l1 = [{'key2': 'value2'}]
d1 = {'key3': 'value3'}
s2 = json.loads(s1) #使用loads反序列化
print('s1的内容:',s1)
print("s1的类型:",type(s1))
print('s2的内容:',s2)
print("s2的类型:",type(s2))
l2 = json.dumps(l1)
print('l1的内容:',l1)
print("l1的类型:",type(l1))
print('l2的内容:',l2)
print("l2的类型:",type(l2))
d2 = json.dumps(d1)
print('d1的内容:',d1)
print("d1的类型:",type(d1))
print('d2的内容:',d2)
print("d2的类型",type(d2))
执行结果:
s1的内容: {"key1": "value1"}
s1的类型: <class 'str'>
s2的内容: {'key1': 'value1'}
s2的类型: <class 'dict'>
l1的内容: [{'key2': 'value2'}]
l1的类型: <class 'list'>
l2的内容: [{"key2": "value2"}]
l2的类型: <class 'str'>
d1的内容: {'key3': 'value3'}
d1的类型: <class 'dict'>
d2的内容: {"key3": "value3"}
2、dump和load用于对文件进行序列化和反序列化
dump:主要用于json文件的读写,json.dump(x,f),x是对象,f是一个文件对象,这个方法可以将json字符串写入到文本文件中
load:加载json文件
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import json
d1 = {'key2':'value2'}
json.dump(d1,open('序列化.txt','w')) #将s1序列化,并写入文件
e1 = json.load(open('序列化.txt','r')) #读取json文件
print("e1的类型:",type(e1))
print('e1的内容:',e1)
执行结果:
e1的类型: <class 'dict'>
e1的内容: {'key2': 'value2'}