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

  ] }
View Code

  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'>
View Code

  二、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"}
View Code

  (二) 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)
View Code

  (三) 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
View Code

  (四) 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}
View Code