如何在Python中比較JSON物件而不考慮順序?


JSON,代表 JavaScript 物件表示法,是一種廣泛用於在 Web 上交換資料的常用資料格式。在 Python 中,通常需要比較兩個 JSON 物件以確定它們是否相同。但是,當物件具有相同的元素但順序不同時,比較 JSON 物件可能是一項具有挑戰性的任務。

在本文中,我們將探討三種不同的方法來比較 Python 中的 JSON 物件,而不管它們的順序如何。我們將討論將 JSON 物件轉換為字典、排序 JSON 物件以及使用 jsondiff 第三方庫來比較 JSON 物件的技術。每種方法都有其自身的優缺點,最合適的方法取決於被比較的 JSON 物件的複雜性。透過使用本文中討論的技術,您將能夠自信地比較 Python 中的 JSON 物件並確保您的程式碼正常執行。

方法一:將 JSON 物件轉換為字典

比較 Python 中 JSON 物件的一種方法是將它們轉換為字典並比較這些字典。字典是 Python 中無序的資料結構,Python 的內建 dict 類提供了用於比較字典而不考慮其順序的方法。

示例

以下是如何將兩個 JSON 物件轉換為字典並比較它們的示例

import json

# JSON objects to compare
json_obj1 = '{"name": "John", "age": 30, "city": "New York"}'
json_obj2 = '{"age": 30, "city": "New York", "name": "John"}'

# Convert JSON objects to dictionaries
dict1 = json.loads(json_obj1)
dict2 = json.loads(json_obj2)

# Compare dictionaries
if dict1 == dict2:
    print("The JSON objects are equal.")
else:
    print("The JSON objects are not equal.")

在上面的示例中,我們使用 Python 內建 json 模組提供的 json.loads 方法將 JSON 物件 json_obj1 和 json_obj2 轉換為字典。隨後,我們使用 == 運算子比較這兩個字典。

輸出

給定程式碼的輸出結果將是

The JSON objects are equal.

程式碼的輸出表明,儘管兩個 JSON 物件的元素順序不同,但它們是相等的。此技術適用於比較具有少量元素的簡單 JSON 物件。

方法二:排序 JSON 物件

在比較之前對 JSON 物件進行排序可以成為比較 Python 中 JSON 物件的有效解決方案。但是,對於大型或複雜的物件,這可能並不理想,因為排序過程在計算上可能代價高昂。為了最佳化效率,我們可以在比較之前對錶示 JSON 物件的字典進行排序。這確保了兩個物件中的鍵以一致的方式排序,從而可以有效地比較鍵值對。排序是透過 Python 中的 sorted 函式實現的,該函式按字母順序排列鍵並比較關聯的值。

示例

以下是如何使用排序方法比較兩個 JSON 物件的示例

import json

# JSON objects to compare
json_obj1 = '{"name": "John", "age": 30, "city": "New York"}'
json_obj2 = '{"age": 30, "city": "New York", "name": "John"}'

# Sort JSON objects
sorted_json_obj1 = json.dumps(json.loads(json_obj1), sort_keys=True)
sorted_json_obj2 = json.dumps(json.loads(json_obj2), sort_keys=True)

# Compare sorted JSON objects
if sorted_json_obj1 == sorted_json_obj2:
    print("The JSON objects are equal.")
else:
    print("The JSON objects are not equal.")

在上面的示例中,我們首先使用 json 模組的 json.loads 方法將兩個 JSON 物件 json_obj1 和 json_obj2 轉換為字典。然後透過使用 sort_keys=True 引數呼叫 dumps 方法來對每個 JSON 物件中的元素進行排序。最後,我們使用 == 運算子比較排序後的 JSON 物件。

輸出

給定程式碼的輸出結果將是

The JSON objects are equal.

此輸出表明這兩個 JSON 物件是相等的,即使它們的元素在排序前順序不同。排序方法是比較 JSON 物件的有效方法,尤其是在處理具有少量元素的簡單 JSON 物件時,它不適用於大量元素。

方法三:使用 jsondiff

比較 Python 中 JSON 物件的另一種方法是使用名為 jsondiff 的第三方庫。此庫提供了一系列專門設計用於比較 JSON 物件的方法,包括那些具有不同順序的相同元素的物件。

示例

以下是如何使用 jsondiff 庫比較兩個 JSON 物件的示例

import jsondiff

# JSON objects to compare
json_obj1 = '{"name": "John", "age": 30, "city": "New York"}'
json_obj2 = '{"age": 30, "city": "New York", "name": "John"}'

# Compare JSON objects using jsondiff
diff = jsondiff.diff(json_obj1, json_obj2, syntax='symmetric')

# Print the difference between the two JSON objects
print(diff)

上面的程式碼使用 jsondiff 庫中的 diff 函式來比較兩個 JSON 物件 json_obj1 和 json_obj2。syntax 引數設定為 'symmetric',表示比較將不考慮 JSON 物件中元素的順序進行。diff 函式的輸出將是兩個 JSON 物件之間差異的可讀表示。

輸出

給定程式碼的輸出結果將是

[{'op': 'change', 'path': '/name', 'value': 'John', 'old_value': None},
 {'op': 'change', 'path': '/age', 'value': 30, 'old_value': None},
 {'op': 'change', 'path': '/city', 'value': 'New York', 'old_value': None}]

此輸出表明這兩個 JSON 物件不同,但只是元素順序不同。

結論

總之,本文演示了三種在不考慮順序的情況下比較 Python 中 JSON 物件的方法。本文討論的三種方法,即將 JSON 物件轉換為字典、排序 JSON 物件和使用 jsondiff 庫,各有其獨特的優缺點。

對於只有少量元素的簡單 JSON 物件,將 JSON 物件轉換為字典或對其進行排序可能是最直接的方法。另一方面,對於具有許多元素的更復雜的 JSON 物件,jsondiff 庫可能是更好的選擇。透過使用這些方法,您可以自信地比較 Python 中的 JSON 物件並確保您的程式碼正常執行。重要的是為被比較的 JSON 物件的複雜性選擇最合適的方法。無論使用哪種方法,這些技術都可以成為開發和除錯涉及 JSON 物件的 Python 程式碼的有用工具。

更新於:2023年7月20日

11K+ 瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.