Python學習:json模塊

簡介

JSON的全稱是 JaveScript Object Notation ,即JavaScript對象符合。JSON是一種輕量級的,跨平臺,跨語言的數據交換格式,其設計的目的,是將所有的事情都用設計的字符串來表示,這樣可以方便在網上傳輸數據,也便於人類閱讀。

在早期,JSON是JavaScript語言的數據交換格式,後來發展爲與特定的編程語言無關的數據交互格式,類似於XML。因此JSON是一種非常理想的數據交換格式。

JSON主要有兩種數據結構:

  1. 由key-value對組成的數據結構,這樣的數據結構在不同的編程語言中具有不同的實現,比如在Python中是一種字典,在C語言中是一個struct;
  2. 有序集合,這樣的數據結構,在Python中對應列表,在C語言中對應數組等。

Python的JSON支持

在Python語言中,json模塊提供了對JSON的支持。json模塊包含了將JSON字符串恢復成Python對象的函數,也包含了將Python對象轉換爲JSON字符串的函數。

JSON類型轉換爲Python類型的對應關係

JSON類型 Python類型
對象object 字典dict
數組array 列表list
字符串string 字符串str
整數int 整數int
實數real 浮點數float
true True
false False
null None

在Python交互式解釋器中導入json模塊後,通過__all__屬性可以知道json模塊的全部屬性與函數:

>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']

在json模塊中常用的函數包括:

#將 obj 對象轉換成 JSON 字符串輸出到 fp 流中,fp 是一個支持 write() 方法的類文件對象
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

#將 obj 對象轉換爲 JSON 字符串,並返回該 JSON 字符串
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan= True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

#從 fp 流讀取 JSON 字符串,將其恢復成 JSON 對象,其中 fp 是一個支持 read() 方法的類文件對象
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

#將 JSON 字符串 s 恢復成 JSON 對象
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

將Python對象轉換爲JSON字符串 範例

範例代碼如下,實際上dumps與dump函數的功能,所支持的選項基本相同,只是dumps函數直接返回轉換得到的JSON字符串,而dump函數則將轉換得到的JSON字符串輸出到文件中:

import json

# 將Python對象轉JSON字符串(元組會當成數組)
s = json.dumps(['yeeku', {'favorite': ('coding', None, 'game', 25)}])
print(s) # ["yeeku", {"favorite": ["coding", null, "game", 25]}]

# 簡單的Python字符串轉JSON
s2 = json.dumps("\"foo\bar")
print(s2) #"\"foo\bar"

# 簡單的Python字符串轉JSON
s3 = json.dumps('\\')
print(s3) #"\\"

# Python的dict對象轉JSON,並對key排序
s4 = json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
print(s4) #{"a": 0, "b": 0, "c": 0}

# 將Python列表轉JSON,
# 並指定JSON分隔符:逗號和冒號之後沒有空格(默認有空格)
s5 = json.dumps([1, 2, 3, {'x': 5, 'y': 7}], separators=(',', ':'))
# 輸出的JSON字符串中逗號和冒號之後沒有空格
print(s5) # '[1,2,3,{"4":5,"6":7}]'

# 指定indent爲4,意味着轉換的JSON字符串有縮進
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
print(s6)

# 使用JSONEncoder的encode方法將Python轉JSON
s7 = json.JSONEncoder().encode({"names": ("孫悟空", "齊天大聖")})
print(s7) # {"names": ["\u5b59\u609f\u7a7a", "\u9f50\u5929\u5927\u5723"]}

f = open('a.json', 'w')
# 使用dump()函數將轉換得到JSON字符串輸出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)

將JSON字符串轉換爲Python對象 範例

範例代碼如下:

import json

# 將JSON字符串恢復成Python列表
result1 = json.loads('["yeeku", {"favorite": ["coding", null, "game", 25]}]')
print(result1) # ['yeeku', {'favorite': ['coding', None, 'game', 25]}]

# 將JSON字符串恢復成Python字符串
result2 = json.loads('"\\"foo\\"bar"')
print(result2) # "foo"bar

# 定義一個自定義的轉化函數
def as_complex(dct):
    if '__complex__' in dct:
        return complex(dct['real'], dct['imag'])
    return dct
# 使用自定義的恢複函數
# 自定義回複函數將real數據轉成複數的實部,將imag轉成複數的虛部
result3 = json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
print(result3) # (1+2j)

f = open('a.json')
# 從文件流恢復JSON列表
result4 = json.load(f)
print(result4) # ['Kotlin', {'Python': 'excellent'}]
發佈了68 篇原創文章 · 獲贊 4 · 訪問量 9143
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章