<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,它是JavaScript的子集,易於人閱讀和編寫。
JSON用來儲存和交換文字資訊,比xml更小/更快/更易解析,易於讀寫,佔用頻寬小,網路傳輸速度快的特性,適用於資料量大,不要求保留原有型別的情況。。
前端和後端進行資料互動,其實就是JS和Python進行資料互動!
" "
)來包括一併列舉出Python與JSON資料型別的對映關係:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
在花括號中書寫,物件可以包含多個名稱/值
對。
例:
{"firstname": "jonh", "lastname": "Doe"}
Employees是包含三個物件的陣列。
每個物件代表一條關於某個人名的記錄,在方括號中書寫,陣列可以包含多個物件:
{ "employees": [ { 「firstName」:「John」 , 「lastName」:「Doe」 }, { 「firstName」:「Anna」 , 「lastName」:「Smith」 }, { 「firstName」:「Peter」 , 「lastName」:「Jones」 } ] }
python在使用json這個模組前,首先要匯入json庫:import json
.
方法 | 描述 |
json.dumps() | 將 Python 物件編碼成 JSON 字串 |
json.loads() | 將已編碼的 JSON 字串解碼為 Python 物件 |
json.dump() | 將Python內建型別序列化為json物件後寫入檔案 |
json.load() | 讀取檔案中json形式的字串元素轉化為Python型別 |
注意:不帶s的是序列化到檔案或者從檔案反序列化,帶s的都是記憶體操作不涉及持久化。
import json data = {'name':'nanbei','age':18} # 將Python物件編碼成json字串 print(json.dumps(data))
結果:
{"name": "nanbei", "age": 18}
注: 在這裡我們可以看到,原先的單引號已經變成雙引號了
import json data = {'name':'nanbei','age':18} # 將Python物件編碼成json字串 # print(json.dumps(data)) # 將json字串解碼成Python物件 a = json.dumps(data) print(json.loads(a))
結果:
{'name': 'nanbei', 'age': 18}
在這裡舉個元組和列表的例子:
import json data = (1,2,3,4) data_json = [1,2,3,4] #將Python物件編碼成json字串 print(json.dumps(data)) print(json.dumps(data_json)) #將Python物件編碼成json字串 a = json.dumps(data) b = json.dumps(data_json) #將json字串編碼成Python物件 print(json.loads(a)) print(json.loads(b))
結果:
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
可以看到,元組和列表解析出來的均是陣列。
由以上輸出可以看出編碼過程中,Python中的list和tuple都被轉化成json的陣列,而解碼後,json的陣列最終被轉化成Python的list的,無論是原來是list還是tuple。
將Python內建型別序列化為json物件後寫入檔案:
import json data = { 'nanbei':'haha', 'a':[1,2,3,4], 'b':(1,2,3) } with open('json_test.txt','w+') as f: json.dump(data,f)
讀取檔案中json形式的字串元素轉化為Python型別:
import json data = { 'nanbei':'haha', 'a':[1,2,3,4], 'b':(1,2,3) } with open('json_test.txt','w+') as f: json.dump(data,f) with open('json_test.txt','r+') as f: print(json.load(f))
結果:
{'a': [1, 2, 3, 4], 'b': [1, 2, 3], 'nanbei': 'haha'}
json.dumps()
:將一個Python資料型別列表編碼成json格式的字串
#python的列表轉換為json的陣列 >>> import json >>> json.dumps([1,2,3]) '[1, 2, 3]' #python的字串轉換為json的字串 >>> json.dumps('abdcs') '"abdcs"' #python的元祖轉換為json的陣列 >>> json.dumps((1,2,3,'a')) '[1, 2, 3, "a"]'#注意此時顯示的是方括號 #python的字典轉換為json的物件 >>> json.dumps({1:'a',2:'b'}) '{"1": "a", "2": "b"}'#注意此時1和2轉換後是加了引號的,因為json的名稱是必須要加引號的 #python的整數轉換為json的數位 >>> json.dumps(13) '13' #python的浮點數轉換為json的數位 >>> json.dumps(3.1415) '3.1415' #python的unicode字串轉換為json的字串 >>> json.dumps(u'a') '"a"' #python的True轉換為json的陣列true >>> json.dumps(True) 'true' #python的False轉換為json的陣列false >>> json.dumps(False) 'false' #python的None轉換為json的null >>> json.dumps(None) 'null' #json本質上是一個字串 >>> type(json.dumps('abc')) <class 'str'>
dump和dumps:
import json # dumps可以格式化所有的基本資料型別為字串 data1 = json.dumps([]) # 列表 print(data1, type(data1)) data2 = json.dumps(2) # 數位 print(data2, type(data2)) data3 = json.dumps('3') # 字串 print(data3, type(data3)) dict = {"name": "Tom", "age": 23} # 字典 data4 = json.dumps(dict) print(data4, type(data4)) with open("test.json", "w", encoding='utf-8') as f: # indent 超級好用,格式化儲存字典,預設為None,小於0為零個空格 f.write(json.dumps(dict, indent=4)) json.dump(dict, f, indent=4) # 傳入檔案描述符,和dumps一樣的結果
得到的輸出結果如下:格式化所有的資料型別為str
型別:
[] <class 'str'> 2 <class 'str'> "3" <class 'str'> {"name": "Tom", "age": 23} <class 'str'>
test.json
中的內容:
{ "name": "Tom", "age": 23 }
load和loads
import json dict = '{"name": "Tom", "age": 23}' # 將字串還原為dict data1 = json.loads(dict) print(data1, type(data1)) with open("test.json", "r", encoding='utf-8') as f: data2 = json.loads(f.read()) # load的傳入引數為字串型別 print(data2, type(data2)) f.seek(0) # 將檔案遊標移動到檔案開頭位置 data3 = json.load(f) print(data3, type(data3))
執行結果如下:
{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>
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):
函數作用: 將Python物件轉變成JSON物件,便於序列化記憶體/檔案中。
引數:
對於dump來說,只是多了一個fp
引數:
簡單說就是dump需要一個類似檔案指標的引數(並不是真正的指標,可以稱之為檔案物件),與檔案操作相結合,即先將Python檔案物件轉化為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) Serialize ``obj`` as a JSON formatted stream to ``fp`` (a``.write()``-supporting file-like object).
類似Java中的class implements java.io.Serializable
Java提供了一種物件序列化的機制,該機制中,一個物件可以被表示為一個位元組序列,該位元組序列包括該物件的資料、有關物件的型別的資訊和儲存在物件中資料的型別。
JSON反序列化為類物件或者類的範例,使用的是loads()方法中的object_hook引數:
程式碼範例:
import json # 定義一個員工類 class Employee(object): def __init__(self,name,age,sex,tel): self.name=name self.age=age self.sex=sex self.tel=tel # 範例化一個物件 emp = Employee('kongsh',18,'female',13123456789) # 定義JSON轉換Python範例的函數 def jsonToClass(emp): return Employee(emp['name'], emp['age'], emp['sex'], emp['tel']) # 定義一個json字串(字典) json_str = '{"name": "kongsh", "age": 18, "sex": "female", "tel": 13123456789}' emp = json.loads(json_str, object_hook=jsonToClass) print (emp) print(emp.name)
結果展示:
假如要讀取一個多行的JSON檔案:
{"阪": ["阪5742"]} {"構": ["構6784"]} {"共": ["共5171"]} {"鉤": ["鉤94a9"]} {"骯": ["骯80ae"]} {"孤": ["孤5b64"]}
如果直接使用:
with open(json_path, 'r') as f: json_data = json.load(f)
就會報錯:丟擲異常JSONDecodeError
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 17)
表示資料錯誤,資料太多,第2行第一列
因為json只能讀取一個檔案物件,有兩個解決辦法
1. 單行讀取檔案:
with open(json_path, 'r') as f: for line in f.readlines(): json_data = json.loads(line)
但是這種做法還有個問題,如果JSON檔案中包含空行,還是會丟擲JSONDecodeError
異常。
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)
可以先處理空行,再進行檔案讀取操作:
for line in f.readlines(): line = line.strip() # 使用strip函數去除空行 if len(line) != 0: json_data = json.loads(line)
2. 合併為一個物件:
將json檔案處理成一個物件檔案(序列化):
{"dict": [ {"阪": ["阪5742"]}, {"構": ["構6784"]}, {"共": ["共5171"]}, {"鉤": ["鉤94a9"]}, {"骯": ["骯80ae"]}, {"孤": ["孤5b64"]} ]}
然後再用:
with open(json_path, 'r') as f: json_data = json.loads(f.read())
# ensure_ascii=False 表示在控制檯能夠顯示中文 json_str = json.dumps(center_data_list, ensure_ascii=False)
個人總結:
到此這篇關於Python中JSON的基本使用的文章就介紹到這了,更多相關Python JSON使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45