英文 | https://www.ordinarycoders.com/blog/article/work-with-JSON-Python
翻譯 | 小愛
在本文中,我們将學習如何在Python中使用JSON資料。JSON代表JavaScript Object Notation,它是一種流行的基于文本的資料格式。
盡管JSON是從JS派生的,但它已經獨立于語言一段時間了。
是以,任何程式設計語言都可以使用它。它用于存儲和交換資料。
例如,從API提取資料或在某些文檔資料庫中使用資料時,資料大多采用JSON格式。讓我們舉個例子。
{
"name":"Ashton",
"age":15,
"grade":8,
"subjects":["math", "english", "science"],
}
如你所見,以上資料非常易讀,看起來很像Python。資料項由鍵/值對組成,鍵/值對之間包含一個冒号(:)。此外,兩個資料項之間用逗号(,)分隔。
從入門開始,讓我們開始,看看如何在Python中處理JSON資料。
Python具有對JSON的本地支援,并為此提供了内置子產品json。在代碼頂部添加以下行以開始使用JSON。
import json
首先,讓我們看一下如何執行序列化,即編碼JSON資料。
編碼JSON資料(從Python到JSON)
将JSON寫入檔案
json子產品提供dump()方法以将JSON資料寫入檔案。它帶有兩個必需的參數,一個要編碼的Python對象和一個類似檔案的執行個體。考慮以下示例。
import json
student_data = {
"name":"Ashton",
"age": 15,
"grade": 8,
"subjects": ["math", "english", "science"]
}
f = open("output.json", 'w')
json.dump(student_data, f)
輸出
{“ name”:“ Ashton”,“ age”:15,“ grade”:8,“ subject”:[“ math”,“ english”,“ science”]
如上例所示,我們有一個Python字典,其中包含學生的資訊,例如姓名,年齡,年級和科目。我們以寫入模式打開output.json檔案,然後将student_data對象轉儲到JSON檔案中。
請考慮下表,該表顯示了Python對象到JSON的轉換。
你還可以使用一些參數以更漂亮的格式寫入JSON資料。例如,縮進參數可以采用非負整數或字元串來指定縮進值。
如果傳遞0,負值或空字元串,則dump()将僅插入換行符。此外,設定“無”(預設值)可得到最緊湊的表示形式。
你還可以通過将True傳遞給sort_keys參數來按鍵對資料進行排序。預設情況下,它為False。讓我們舉個例子。
import json
student_data = {
"name":"Ashton",
"age": 15,
"grade": 8,
"subjects": ["math", "english", "science"]
}
f = open("output.json", 'w')
json.dump(student_data, f, indent=2, sort_keys=True)
輸出
{
"age": 15,
"grade": 8,
"name": "Ashton",
"subjects": " [
"math",
"english",
"science",
]
}
正如你在上面的輸出中看到的那樣,它更幹淨,更易于閱讀。
将Python對象轉換為JSON字元串
要将序列化的對象轉換為JSON字元串,可以使用dumps()方法。它類似于dump(),不同之處在于它不需要檔案對象,并且它傳回包含JSON格式資訊的字元串。讓我們來看看。
import json
student_data = {
"name":"Ashton",
"age": 15,
"grade": 8,
"subjects": ["math", "english", "science"]
}
json_string = json.dumps(student_data, indent=2, sort_keys=True)
print(json_string)
print(type(json_string))
輸出
{
"age": 15,
"grade": 8,
"name": "Ashton",
"subjects": [
"math",
"english",
"science"
]
}
<class 'str'>
現在,讓我們繼續看看如何執行反序列化,即解碼JSON資料。
解碼JSON資料(将JSON轉換為Python)
解析JSON檔案
json子產品提供load()方法,以将JSON從檔案加載到Python對象。它需要一個類似檔案的對象作為其必需參數。示例如下。
import json
f = open('sample.json', 'r')
data = json.load(f)
print(data)
print(type(data))
輸出
{'name':'Ashton','age':15,'grade':8,'address':None,subject':['math','english','science']}
<class'dict'>
下表列出了從JSON到Python的轉換規則。
将JSON字元串解析為對象
同樣,你可以使用loads()方法将JSON字元串轉換為Python對象。它使用包含JSON文檔的字元串作為其必需參數。讓我們來看看。
import json
json_str = '''{
"name":"Ashton",
"age":15,
"grade":8,
"address":null,
"subjects":["math", "english", "science"]
}'''
data_parsed = json.loads(json_str)
print(data)
print(type(data))
輸出
{'name': 'Ashton', 'age': 15, 'grade': 8, 'address': None, 'subjects':
['math', 'english', 'science']}
<class 'dict'>
在這裡,json_str變量在多行字元串中包含一個JSON文檔。使用loads()方法将其解析為字典。
這裡要注意的另一件事是,如果先對Python對象進行序列化然後反序列化,則它不一定等于原始對象。考慮以下示例。
import json
student_data = {
"name":"Ashton",
"age": 15,
"grade": 8,
"subjects": ("math", "english", "science")
}
json_string = json.dumps(student_data, indent=2, sort_keys=True)
parsed_data = json.loads(json_string)
print(student_data==parsed_data)
輸出
false
在上面的示例中,student_data包含一個關鍵主題,其值是元組類型。當student_data序列化為JSON字元串時,受試者的值将根據轉換規則轉換為數組。當我們執行解碼時,它會轉換為清單而不是元組。是以,原始資料和解碼後的資料不相等。