load vs loads dump vs dumps

json 模組包含用於讀取和寫入 unicode 字串以及讀取和寫入檔案的函式。這些由函式名稱中的尾隨 s 區分。在這些示例中,我們使用 StringIO 物件,但相同的函式將適用於任何類檔案物件。

這裡我們使用基於字串的函式:

import json

data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
# u'{"foo": "bar", "baz": []}'
json.loads(json_string)
# {u"foo": u"bar", u"baz": []}

在這裡我們使用基於檔案的功能:

import json

from io import StringIO

json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)
json_file.seek(0)  # Seek back to the start of the file before reading
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
json_file.seek(0)  # Seek back to the start of the file before reading
json.load(json_file)
# {u"foo": u"bar", u"baz": []}

正如你所看到的,主要區別在於轉儲 json 資料時必須將檔案控制代碼傳遞給函式,而不是捕獲返回值。另外值得注意的是,你必須在讀取或寫入之前尋找檔案的開頭,以避免資料損壞。開啟檔案時,游標位於 0 的位置,因此下面也可以:

import json

json_file_path = './data.json'
data = {u"foo": u"bar", u"baz": []}

with open(json_file_path, 'w') as json_file:
    json.dump(data, json_file)

with open(json_file_path) as json_file:
    json_file_content = json_file.read()
    # u'{"foo": "bar", "baz": []}'

with open(json_file_path) as json_file:
    json.load(json_file)
    # {u"foo": u"bar", u"baz": []}

有兩種處理 json 資料的方法允許你習慣性地和有效地使用構建在 json 上的格式,例如 pyspark 的 json-per-line:

# loading from a file
data = [json.loads(line) for line in open(file_path).splitlines()]

# dumping to a file
with open(file_path, 'w') as json_file:
    for item in data:
        json.dump(item, json_file)
        json_file.write('\n')