Python | JSON 資料解析(Json & JsonPath)
一、什麼是JSON?
JSON(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
簡單地說,JSON 可以將 JavaScript 物件中表示的一組資料轉換為字串,然後就可以在網路或者程式之間輕鬆地傳遞這個字串,並在需要的時候將它還原為各程式語言所支援的資料格式,例如在 PHP 中,可以將 JSON 還原為陣列或者一個基本物件。在用到AJAX時,如果需要用到陣列傳值,這時就需要用JSON將陣列轉化為字串。
二、JSON vs XML
-
JSON 與 XML 的相同之處:
- JSON 和 XML 資料都是 "自我描述" ,都易於理解。
- JSON 和 XML 資料都是有層次的結構
- JSON 和 XML 資料可以被大多數程式語言使用
-
JSON 與 XML 的不同之處:
- JSON 不需要結束標籤
- JSON 更加簡短
- JSON 讀寫速度更快
- JSON 可以使用陣列
為什麼 JSON 比 XML 更好?
XML 比 JSON 更難解析。
JSON 可以直接使用現有的 JavaScript 物件解析。
針對 AJAX 應用,JSON 比 XML 資料載入更快,而且更簡單:
-
使用 XML
- 獲取 XML 文件
- 使用 XML DOM 迭代迴圈文件
- 接資料解析出來複制給變數
-
使用 JSON
- 獲取 JSON 字串
- JSON.Parse 解析 JSON 字串
三、Python中JSON模組的使用
Python3 中可以使用 json 模組來對 JSON 資料進行編解碼,它主要提供了四個方法: dumps、dump、loads、load。
json.dumps() :將 Python 物件編碼成 JSON 字串
json.loads() :將已編碼的 JSON 字串解碼為 Python 物件
在 json 的編解碼過程中,Python 的原始型別與 json 型別會相互轉換,具體的轉化對照如下:
Python 編碼為 JSON 型別轉換對應表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
JSON 解碼為 Python 型別轉換對應表:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
json.dump() :將Python內建型別序列化為json物件後寫入檔案
json.load() :讀取檔案中json形式的字串元素轉化為Python型別
如果你要處理的是檔案而不是字串,你可以使用 json.dump() 和 json.load() 來編碼和解碼JSON資料。例如:
# 寫入 JSON 資料
with open('data.json', 'w') as f:
json.dump(data, f)
# 讀取資料
with open('data.json', 'r') as f:
data = json.load(f)
四、Python中JsonPath模組的使用
JsonPath 是一種資訊抽取類庫,是從JSON文件中抽取指定資訊的工具,提供多種語言實現版本,包括:Javascript, Python, PHP 和 Java。
JsonPath 對於 JSON 來說,相當於 XPATH 對於 XML。
Json結構清晰,可讀性高,複雜度低,非常容易匹配,下表中對應了XPath的用法。
XPath | JSONPath | 描述 |
---|---|---|
/ |
$ |
根節點 |
. |
@ |
現行節點 |
/ |
. or[] |
取子節點 |
.. |
n/a | 取父節點,Jsonpath未支援 |
// |
.. |
就是不管位置,選擇所有符合條件的條件 |
* |
* |
匹配所有元素節點 |
@ |
n/a | 根據屬性訪問,Json不支援,因為Json是個Key-value遞迴結構,不需要。 |
[] |
[] |
迭代器標示(可以在裡邊做簡單的迭代操作,如陣列下標,根據內容選值等) |
\| |
[,] |
支援迭代器中做多選。 |
[] |
?() |
支援過濾操作. |
n/a | () |
支援表示式計算 |
() |
n/a | 分組,JsonPath不支援 |
五、例項
暫時沒有喔o(╥﹏╥)o
Collection:因為這些東西是非常簡單的。不要抱怨自己學不會,那是因為你沒有足夠用心。