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"}'

参考

posted @ 2016-12-15 22:28  银河统计  阅读(389)  评论(0编辑  收藏  举报