json(JavaScript Object Notation),是一种轻量级的数据交换语言,使用C语言习惯,易于人阅读和编写,也易于机器解析和生成,是一种理想的数据交换语言。
json简单的说:就是JavaScript通过对象和数组这两种结构,表示复杂的数据结构,并将对象表示的一组数据转换成字符串,用于传递。(官方说明:http://json.org/)
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
JS中的对象和数组,就是python中的字典和列表。python中自带json模块,用于python程序与web的数据交换。
一、 json.loads 解析json(把json解析成python)
# 使用requests模块访问url:http://www.weather.com.cn/adat/sk/101220101.html import requests response = requests.get('http://www.weather.com.cn/adat/sk/101220101.html') response.encoding = 'utf_8' ret = response.text print(type(ret),ret) # <class 'str'> # 解析json成python import json ret_json_loads = json.loads(ret) print(type(ret_json_loads),ret_json_loads) # <class 'dict'>
二、json.dumps 生成json(把python转换成json)
# # python转换成json import json obj = ['hi',(1,'2','re'),{'k1':2,"k2":'2'}] # 自定义对象 obj_dumps = json.dumps(obj)
obj_repr = repr(obj) print(type(obj),obj) # <class 'list'> ['hi', (1, '2', 're'), {'k1': 2, 'k2': '2'}] print(type(obj_repr),obj_repr) # <class 'str'> ['hi', (1, '2', 're'), {'k1': 2, 'k2': '2'}] print(type(obj_dumps),obj_dumps) # <class 'str'> ["hi", [1, "2", "re"], {"k1": 2, "k2": "2"}]
上例可以看出,在json的编码过程中,存在从python原始类型向json类型转换的过程,比如python中的元组编码成了json中的数组。
另外,json中的字符串使用双引号(" ")表示。
P.S.:
json.dumps()中含有一些有用的参数,通过参数设置可以使数据可读性更强,常用的如下。但是,增强数据可读性的同时,系统需要做些额外的工作,会增加一定的性能消耗。
(一)sort_keys = True 字典按keys排序
由于字典的keys是无序的,不利于阅读和处理,通过此参数可对keys进行排序。默认sort_keys = False,不排序。
# sort.keys import json data1 = {'name':'lucy','age':5} data2 = {'age':4,'name':'luna'} data1_json = json.dumps(data1) data2_json = json.dumps(data2) data1_json_sort = json.dumps(data1,sort_keys=True) data2_json_sort = json.dumps(data2,sort_keys=True) print(type(data1),data1) # <class 'dict'> {'name': 'lucy', 'age': 5} print(type(data2),data2) # <class 'dict'> {'age': 4, 'name': 'luna'} print(type(data1_json),data1_json) # <class 'str'> {"name": "lucy", "age": 5} print(type(data2_json),data2_json) # <class 'str'> {"age": 4, "name": "luna"} print(type(data1_json_sort),data1_json_sort) # <class 'str'> {"age": 5, "name": "lucy"} print(type(data2_json_sort),data2_json_sort) # <class 'str'> {"age": 4, "name": "luna"}
(二) indent 缩进的意思,可以使数据的存储格式更加的优雅,默认indent = None无缩进
indent = 0 只换行,不缩进;indent = (int)换行,同时缩进int个空格。
import json obj = {'weatherinfo': {'city': '合肥', 'cityid': '101220101', 'temp': '11', 'WD': '北风', 'WS': '2级', 'SD': '87%', 'WSE': '2', 'time': '10:25', 'isRadar': '1', 'Radar': 'JC_RADAR_AZ9551_JB', 'njd': '暂无实况', 'qy': '1010'}} # obj_dumps = json.dumps(obj,sort_keys=True,indent=None) # 默认,无缩进、无换行 obj_dumps = json.dumps(obj,sort_keys=True,indent=0) # 换行、无缩进 # obj_dumps = json.dumps(obj,sort_keys=True,indent=4) # 换行、缩进4个字符 print(obj_dumps)
(三) separator = (',',':') 移除多余字符,对数据进行压缩。默认separator =None,不压缩。
import json data = {'b':2,'c':3,'a':1} data_repr = repr(data) data_dumps = json.dumps(data) data_dumps_sortkeys = json.dumps(data,sort_keys=True) data_dumps_sortkeys_indent = json.dumps(data,sort_keys=True,indent=4) data_dumps_sortkeys_separator = json.dumps(data,sort_keys=True,separators=(',',':')) print(data) # {'b': 2, 'c': 3, 'a': 1} print('data_repr=',len(data_repr)) # data_repr= 24 print('data_dumps=',len(data_dumps)) # data_dumps= 24 print('data_dumps_sortkeys=',len(data_dumps_sortkeys)) # data_dumps_sortkeys= 24 print('data_dumps_sortkeys_indent=',len(data_dumps_sortkeys_indent)) # data_dumps_sortkeys_indent= 38 print('data_dumps_sortkeys_separator=',len(data_dumps_sortkeys_separator)) # data_dumps_sortkeys_separator= 19
(四) skipkeys = True 剔除key不是字符串的键值对
字典dumps时,要求keys必须是字符串,其他类型会报错,通过设置此参数,可以平滑过渡。
import json data = {(1,2):2,'c':3,'a':1} data_json = json.dumps(data) print(data_json) # TypeError: keys must be a string # # data_json = json.dumps(data,skipkeys=True) # print(data_json) # {"c": 3, "a": 1}
浙公网安备 33010602011771号