活動地址:CSDN21天學習挑戰賽
目錄
1. JSON簡介
2. JSON語法格式
3. python中的json模塊
3.1 python數據類型與json數據類型轉換
3.2 json模塊常用函數
3.2.1 json.dumps()函數 python -> json
3.2.2 json.dump()函數 python -> json 並保存到文件中
3.2.3 json.loads() json -> python
3.2.4 json.load() 讀取json文件並轉換為python
3.3 解析JSON字串或文件
**
**
JSON,Java Script Object Notation,是一種輕量級的文本數據交換格式,JSON獨立於語言,具有自我描述性,更易理解;JSON比XML更小、更快、更易解析;爬蟲經常獲取的接口數據就是JSON格式。
JSON數據格式類似python的字典格式,裡面包括方括號括起來的數組,類似python裡的列表。
語法格式:{key1:value1, key2:value2},如果value表示的數據有很多,用方括號括起來[],稱為數組。
JSON是鍵值對形式構成的,鍵的部分必須用雙引號包裹 "",值的部分,不允許出現函數function,undefined,NaN,但可以有null,不允許出現沒有意義的逗號。
如下:
格式1:JSON 對象
{
"name" : "Jack",
"age" : 18
}
格式2:JSON數組
{
"student":
[
{"name" : "Jack", "age" : 18},
{"name" : "Lucy", "age" : 18}
],
"classroom" : {
"class1" : "room1",
"class2" : "room2"
}
}
python提供了json模塊,作用是使用JSON字符串生成python對象(load),或由python對象格式化成json字符串(dump)。
使用時需要導入模塊:import json
python -> json時,數據類型會有變化,如下:
PythonJSONdictobjectlist,tuplearraystrstringint,float,int-&,float-derived EnumsnumberTruetrueFalsefalseNonenulljson -> python,轉換時數據類型變化如下:
JSONPythonobjectdictarrayliststringstrnumber(int)intnumber(real)floattrueTruefalseFalsenullNonejson.dumps()函數將python數據類型轉換為json格式的字符串。
json.dumps(obj,*,
skipkeys=False, # 是否允許JSON字串編碼字典對象時,字典的key不是字符串類型(默認不允許)
ensure_ascii=True,
check_circular=True,
allow_nan=True,
cls=None,
indent=None, # 定義縮進
separators=None, # 是一個元組,定義分隔符的類型
default=None,
sort_keys=False, # 是否排序
**kw)
使用示例1:將python字典轉換為json字符串
import json
# python 字典
p_persopn = {"name":"jack",
"age":18 ,
"tel":["666888",'12312341234'],
"isOnly":True
}
print("python: ",p_persopn)
# 轉換為json字符串
j_person = json.dumps(p_persopn)
print("JSON: ",j_person)
顯示結果:
python: {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
python <class 'dict'>
JSON: {"name": "jack", "age": 18, "tel": ["666888", "12312341234"], "isOnly": true}
JSON <class 'str'>
從結果中可以看出,python打印的是單引號,數據類型是字典,True首字母大寫;json打印的是雙引號,數據類型是字符串,true全部小寫。
使用示例2:格式化輸出json字串:
import json
# python 字典
p_persopn = {"name":"jack",
"age":18 ,
"tel":["666888",'12312341234'],
"isOnly":True
}
print("python: ",p_persopn)
# 格式化輸出json字串
j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
print("格式化輸出JSON:",j_person)
j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=('!','='))
print("格式化輸出JSON:",j_person)
顯示結果:
python: {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
格式化輸出JSON: {
"age":18,
"isOnly":true,
"name":"jack",
"tel":[
"666888",
"12312341234"
]
}
格式化輸出JSON: {
"age"=18!
"isOnly"=true!
"name"="jack"!
"tel"=[
"666888"!
"12312341234"
]
}
可以看出定義的separators元組的第一個元素是json中每個鍵值對之間的分隔符,元組的第二個元素是json中鍵值對之間的分隔符。
使用示例3:將python字串轉換為json字串後存入文件
import json
# 保存json文件
p_persopn = {"name":"jack",
"age":18 ,
"tel":["666888",'12312341234'],
"isOnly":True
}
print("python: ",p_persopn)
j_person = json.dumps(p_persopn)
with open('test.json','w',encoding='utf-8') as f: # 打開文件
f.write(j_person) # 寫入文件
print("保存json文件完成!")
j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
with open('test_format.json','w',encoding='utf-8') as f: # 打開文件
f.write(j_person) # 寫入文件
print("保存json文件完成!")
顯示結果,新生成的文件:
json.dump()函數:
json.dump(obj,fp,*,
skipkeys=False,
ensure_ascii=True,
check_circular=True,
allow_nan=True,
cls=None,
indent=None,
separators=None,
default=None,
sort_keys=False,
**kw
)
使用示例1:python格式轉換為json格式並保存到文件中
import json
# python -> json 並保存文件
p_persopn = {"name":"jack",
"age":18 ,
"tel":["666888",'12312341234'],
"isOnly":True
}
json.dump(p_persopn,open("data.json","w"))
# 格式化保存python轉換的json
json.dump(p_persopn,open("data_format.json","w"),sort_keys=True,indent=4,separators=(',',':'))
生成的文件顯示:
json.dumps()和json.dump()比較:
語法格式:
json.loads(s,*,
cls=None,
object_hook=None,
parse_float=None,
parse_int=None,
parse_constant=None,
object_pairs_hook=None,
**kw
)
使用示例1:json轉換為python
# 將json轉換為python
p_persopn = {"name":"jack",
"age":18 ,
"tel":["666888",'12312341234'],
"isOnly":True
}
j_person = json.dumps(p_persopn)
# json 轉換為 python
new_python = json.loads(j_person)
print("json -> python:",new_python)
print(type(new_python))
顯示結果:
json -> python: {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
<class 'dict'>
使用示例2:讀取json文件並轉換成python
f = open("data.json",encoding='utf-8')
content = f.read()
python_obj = json.loads(content)
print(python_obj)
print(type(python_obj))
顯示結果:
{'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
<class 'dict'>
json.load()從json格式的文件中讀取數據並轉換為python的類型。
語法格式:
json.load(fp,*,
cls=None,
object_hook==None,
parse_float==None,
parse_int=None,
parse_constant=None,
object_hook=None,
**kw
)
使用示例1:使用函數json.load()從文件中讀取數據並轉換為python的類型
import json
# 使用json.load()從json格式的文件中讀取數據並轉換為python的類型
python_obj = json.load(open('data.json','r'))
print('json.load(): ',python_obj)
print(type(python_obj))
顯示結果:
json.load(): {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
<class 'dict'>
json.load()和json.loads()區別:
分析:不管是JSON字串還是文件,都需要先把JSON格式的內容轉換為python對象,然後逐層輸出python對象(如果轉換後的python對象是多層的話)。
示例代碼1:解析 json 字串
import json
json_str = '{"name":"test","type":{"name":"seq","parameter":["1","2"]}}'
print(json_str)
print(type(json_str))
print("="*70)
# 1. json文件轉換為python對象
p_obj = json.loads(json_str)
print(p_obj)
print(type(p_obj))
print("="*70)
# 2. 查詢具體的數據節點
print(p_obj.keys())
print(p_obj.values())
print("="*60)
print("輸出解析後的json文件")
print("name : ",p_obj["name"])
print("type : ",p_obj["type"])
print("type-name : ",p_obj["type"]["name"])
print("type-parameter : ",p_obj["type"]["parameter"])
print("type-parameter[0]",p_obj["type"]["parameter"][0])
print("type-parameter[1]",p_obj["type"]["parameter"][1])
# 或者遞歸實現JSON文件解析,如下僅解析輸出的字典類型
def parase_dict(dct):
'''
解析輸出json轉換後的python字典數據
'''
keys = dct.keys()
vals = dct.values()
for key in keys:
if isinstance(dct[key],dict):
print(key+" = ", dct[key])
parase_dict(dct[key])
else:
print(key+" = ",dct[key])
顯示結果:
dict_keys(['name', 'type'])
dict_values(['test', {'name': 'seq', 'parameter': ['1', '2']}])
============================================================
輸出解析後的json文件
name : test
type : {'name': 'seq', 'parameter': ['1', '2']}
type-name : seq
type-parameter : ['1', '2']
type-parameter[0] 1
type-parameter[1] 2
示例代碼2:解析JSON文件
import json
def parase_dict(dct):
'''
解析輸出json轉換後的python字典數據
'''
keys = dct.keys()
vals = dct.values()
for key in keys:
if isinstance(dct[key],dict):
print(key+" = ", dct[key])
parase_dict(dct[key])
else:
print(key+" = ",dct[key])
# 解析JSON文件
print("="*60)
p_obj = json.load(open("test.json","r"))
print(p_obj)
parase_dict(p_obj)
顯示結果:
============================================================
{'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
name = jack
age = 18
tel = ['666888', '12312341234']
isOnly = True
Recently, I received a network
記錄下常見錯誤WARNINGS: ?: (urls.W005