JSON是一種輕量級的數據交換格式,常用於前後端數據傳輸。Python中有一個json庫可以很方便地處理JSON數據,其中json.dump方法則是將Python對象轉化為JSON格式並寫入文件的方法。
一、JSON格式的概念與基本語法
JSON是JavaScript對象表示法(JavaScript Object Notation)的縮寫,是一種輕量級的數據格式,具有易讀、易解析、易生成的特點。JSON與Python中的字典類似,由鍵值對(key-value)組成,鍵必須為字元串類型,值可以為字元串、數字、數組、對象等數據類型。下面是一個簡單JSON格式的例子:
{ "name": "Tom", "age": 20, "interests": ["reading", "music", "sports"], "address": { "street": "No.1 Road", "city": "Beijing" } }
在JSON格式中,以花括弧{}表示對象,在對象內部,按照鍵值對的方式表示數據,鍵與值之間用冒號:分隔。多個鍵值對之間用逗號,分隔。鍵必須為雙引號(“”)包裹的字元串類型,值的類型可以是字元串、數字、數組、對象等。在Python中,可以將一個JSON格式的字元串通過json.loads()方法轉化為字典類型,示例如下:
import json json_str = '{ "name": "Tom", "age": 20, "interests": ["reading", "music", "sports"], "address": {"street": "No.1 Road", "city": "Beijing"} }' json_dict = json.loads(json_str) print(json_dict) # 輸出:{'name': 'Tom', 'age': 20, 'interests': ['reading', 'music', 'sports'], 'address': {'street': 'No.1 Road', 'city': 'Beijing'}}
二、json.dump方法的基本使用
json.dump方法是將Python對象轉化為JSON格式並寫入文件的方法。其中,Python對象可以是列表、元組、字典等數據類型,不支持自定義類對象。示例如下:
import json data = { "name": "Tom", "age": 20, "interests": ["reading", "music", "sports"], "address": { "street": "No.1 Road", "city": "Beijing" } } # 將Python對象寫入JSON文件 with open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) # 讀取JSON文件內容並轉化為Python對象 with open('data.json', 'r', encoding='utf-8') as f: json_data = json.load(f) print(json_data) # 輸出:{'name': 'Tom', 'age': 20, 'interests': ['reading', 'music', 'sports'], 'address': {'street': 'No.1 Road', 'city': 'Beijing'}}
上述代碼中,使用json.dump方法將Python對象data轉化為JSON格式並寫入文件data.json中。其中,ensure_ascii=False表示輸出非ASCII字元,indent表示JSON格式的縮進空格數。
三、json.dump方法的高級用法
1. 序列化自定義對象
json.dump方法支持序列化大部分Python內置的數據類型,但不支持諸如set、complex等其中的一些類型。因此,如果要序列化自定義的Python對象,則需要在對象中定義__dict__方法,將對象轉化為一個字典。
示例如下:
import json class Person: def __init__(self, name, age): self.name = name self.age = age def intro(self): print('name: %s, age: %d' % (self.name, self.age)) p = Person('Tom', 20) # 定義__dict__方法,將對象轉化為一個字典 def person2dict(p): return {'name': p.name, 'age': p.age} # 將對象轉化為字典,並寫入JSON文件 with open('data.json', 'w', encoding='utf-8') as f: json.dump(p, f, default=person2dict) # 讀取JSON文件內容並轉化為Python對象 with open('data.json', 'r', encoding='utf-8') as f: json_data = json.load(f) print(json_data) # 輸出:{'name': 'Tom', 'age': 20}
在上述代碼中,定義了一個Person類,其中還定義了一個方法person2dict,用於將對象轉化為一個字典。在定義字典時,要注意鍵必須為字元串類型。在使用json.dump方法將對象序列化為JSON格式時,需要將default參數設置為person2dict函數,將對象轉化為字典格式。
2. 序列化datetime等數據類型
datetime、Decimal等部分數據類型,在序列化為JSON格式時會報錯。此時,可以通過定義一個自定義的編碼器,繼承json.JSONEncoder並重寫default方法來解決問題。
示例如下:
import json import datetime class DateEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') else: return json.JSONEncoder.default(self, obj) data = { "name": "Tom", "age": 20, "birth": datetime.datetime(2000, 1, 1, 11, 11, 11) } # 定義自定義編碼器,並將對象轉化為JSON格式 json_str = json.dumps(data, cls=DateEncoder) # 將JSON格式的字元串寫入文件 with open('data.json', 'w', encoding='utf-8') as f: f.write(json_str) # 讀取JSON文件內容並轉化為Python對象 with open('data.json', 'r', encoding='utf-8') as f: json_data = json.load(f) print(json_data) # 輸出:{'name': 'Tom', 'age': 20, 'birth': '2000-01-01 11:11:11'}
在上述代碼中,定義了一個DateEncoder類,繼承自json.JSONEncoder並重寫了其中的default方法,用於將datetime數據類型轉化為字元串格式。在使用json.dump方法時,將cls參數設置為DateEncoder類,即可實現序列化。
3. 格式化Dump輸出
在json.dump中,還可以設置其中的一些參數來進行格式化輸出等操作。其中一些常用的參數如下:
- ensure_ascii:是否將非ASCII字元轉化為ASCII碼。默認值為True。
- indent:用於指定縮進格式。可以為整數,表示空格的個數;也可以為字元串,如’\\t’表示用製表符作為縮進。默認值為None。
- separators:用於指定分隔符的格式。默認值為(‘,’, ‘:’)。
- sort_keys:是否按鍵的名稱對JSON數據進行排序。默認值為False。
示例如下:
import json data = { "name": "Tom", "age": 20, "interests": ["reading", "music", "sports"], "address": { "street": "No.1 Road", "city": "Beijing" } } # 格式化的Dump輸出 result = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True) print(result) # 輸出: # { # "address": { # "city": "Beijing", # "street": "No.1 Road" # }, # "age": 20, # "interests": [ # "reading", # "music", # "sports" # ], # "name": "Tom" # }
四、小結
json.dump方法是Python中一個非常方便的將Python對象轉化為JSON格式並寫入文件的方法。在使用時,可以通過設置不同的參數來實現不同的操作,例如序列化自定義對象、格式化輸出等。通過學習json.dump的使用方法和相關知識,我們可以更加靈活、高效地進行JSON數據處理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279208.html