天天看點

如何在Python中使用JSON資料

如何在Python中使用JSON資料

英文 | ​​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的轉換。

如何在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的轉換規則。

如何在Python中使用JSON資料

将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字元串時,受試者的值将根據轉換規則轉換為數組。當我們執行解碼時,它會轉換為清單而不是元組。是以,原始資料和解碼後的資料不相等。