Python-模块-JSON
Python-模块-JSON
JSON概念
序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。
JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中,所以对json的各种学习,是自然而然的事情。
Python2.6开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding 和 decoding。
- encoding:把一个Python对象编码转换成Json字符串。
- decoding:把Json格式字符串解码转换成Python对象。
对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。
目录概览
-
1.dumps功能
-
2.dump功能
-
3.loads功能
-
4.load功能
-
5.json编码支持的基本类型
1.dumps功能
-----
# 示例0:
# Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串
import json
data = {"spam" : "foo", "parrot" : 42}
in_json = json.dumps(data) # Encode the data
print(in_json)
python_str = json.loads(in_json) # Decode into a Python object
print(python_str)
# json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
实际上就是对函数的参数的一个理解过程,下面列出几个常用的参数:
Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',',':');这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
encoding:默认是UTF-8,设置json数据的编码方式。
sort_keys:将数据根据keys的值进行排序。
import json
dic1 = {'type':'dic1','username':'abdata','age':16}
json_dic1 = json.dumps(dic1, ensure_ascii=False)
print(json_dic1)
json_dic2 = json.dumps(dic1, sort_keys=True, indent=4, separators=(',',': '), ensure_ascii=False)
print(json_dic2)
# 输出
[{"username": "abdata", "age": 16, "type": "dic1"}]
[
{
"age": 16,
"type": "dic1",
"username": "abdata"
}
]
-----
# 示例1:
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串
import json
data = ['aa', 'bb', 'cc']
j_str = json.dumps(data)
j_str
'["aa", "bb", "cc"]'
-----
# 示例2:
import json
data = [{'a':"A",'b':(2,4),'c':3.0}] #list对象
print("DATA:",repr(data))
data_string = json.dumps(data)
print("JSON:",data_string)
# 输出:
# python的dict类型的数据是没有顺序存储的
DATA: [{'b': (2, 4), 'a': 'A', 'c': 3.0}]
JSON: [{"b": [2, 4], "a": "A", "c": 3.0}]
-----
# 示例3:
# 编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出。
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print('DATA:', repr(data))
print('JSON:', json.dumps(data))
print('SORT:', json.dumps(data, sort_keys=True))
# 输出:
DATA: [{'b': (2, 4), 'c': 3.0, 'a': 'A'}]
JSON: [{"b": [2, 4], "c": 3.0, "a": "A"}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}]
-----
# 示例4:
# indent参数根据数据格式缩进显示,读起来更加清晰:
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print('DATA:', repr(data))
print('NORMAL:', json.dumps(data, sort_keys=True))
print('INDENT:', json.dumps(data, sort_keys=True, indent=2))
# 输出:
DATA: [{'b': (2, 4), 'c': 3.0, 'a': 'A'}]
NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
{
"a": "A",
"b": [
2,
4
],
"c": 3.0
}
]
-----
# 示例5:
# separators参数的作用是去掉,,:后面的空格,从上面的输出结果都能看到", :"后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数。
import json
data = [{'a': 'A', 'b': (2, 4), 'c': 3.0}]
print('DATA:', repr(data))
print('repr(data) :', len(repr(data)))
print('dumps(data) :', len(json.dumps(data)))
print('dumps(data, indent=2) :', len(json.dumps(data, indent=2)))
print('dumps(data, separators):', len(json.dumps(data, separators=(',', ':'))))
# 输出:
DATA: [{'b': (2, 4), 'c': 3.0, 'a': 'A'}]
repr(data) : 35
dumps(data) : 35
dumps(data, indent=2) : 73
dumps(data, separators): 29
-----
# 示例6:
# skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理。
import json
data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
try:
print(json.dumps(data))
except (TypeError, ValueError) as err:
print('ERROR:', err)
print
print(json.dumps(data, skipkeys=True))
# 输出:
ERROR: keys must be a string
[{"b": [2, 4], "c": 3.0, "a": "A"}]
2.dump功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
with open('D:/tmp.json', 'w') as f:
json.dump(data, f)
3.loads功能
-----
# 示例1:
# 将json编码的字符串再转换为python的数据结构
>>> j_str
'["aa", "bb", "cc"]'
>>> mes = json.loads(j_str)
>>> mes
['aa', 'bb', 'cc']
-----
# 示例2:
# json.loads方法处理简单数据类型的decoding(解码)转换
import json
data = [{'a':"A",'b':(2,4),'c':3.0}] # list对象
data_string = json.dumps(data)
print("ENCODED:",data_string)
decoded = json.loads(data_string)
print("DECODED:",decoded)
print("ORIGINAL:",type(data[0]['b']))
print("DECODED:",type(decoded[0]['b']))
# 输出:
ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
DECODED: [{'a': 'A', 'c': 3.0, 'b': [2, 4]}]
ORIGINAL: <class 'tuple'>
DECODED: <class 'list'>
# 解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型。
4.load功能
# 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构
with open('D:/tmp.json', 'r') as f:
data = json.load(f)
5.json编码支持的基本类型
json编码支持的基本类型有:None, bool, int, float, string, list, tuple, dict 。
对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。
json编码的格式几乎和python语法一致,略有不同的是:True会被映射为true,False会被映射为false,None会被映射为null,元组()会被映射为列表[],因为其他语言没有元组的概念,只有数组,也就是列表。
import json
data = {'a':True, 'b':False, 'c':None, 'd':(1,2), 1:'abc'}
j_str = json.dumps(data)
j_str
# 输出
'{"a": true, "c": null, "d": [1, 2], "b": false, "1": "abc"}'
参考
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。