首頁 > 軟體

python中json操作之json.loads、json.load、json.jumps及json.jump用法

2022-08-12 14:03:06

前言

經常在Python中對JSON格式的檔案進行操作,今天對這些操作做一個總結

首先,需要匯入json庫import json

0.python型別與json型別互換表

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

什麼是json字串?

相較於JSON物件,JSON字串(可以理解為一個普通的字串但擁有特殊的格式 這種格式可以用來轉換回JSON物件)可以更加方便的在函數之間傳遞

JSON物件中只能使用雙引號"" 而python物件字典中可以使用單引號''

1.將json字串轉化(反序列化)

(1)json.loads

將JSON字串轉化為 Python 欄位的資料型別。

loads:針對記憶體物件,將string轉換為dict (將string轉換為dict)

def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``s`` (a ``str`` instance containing a JSON
    document) to a Python object."""

json.loads 用於解碼 JSON 資料。該函數返回 Python 欄位的資料型別

jsonData='{"u6d4bu8bd5": 12345, "u5185u5bb9": ["u6211u4e5fu4e0du77e5u9053u6211u8981u5199u4ec0u4e48", "123"]}'

print(jsonData)
print(type(jsonData)) # <class 'str'> 理解為json字串

py_type_info=json.loads(jsonData)

print(py_type_info)
print(type(py_type_info)) # <class 'dict'>

# 輸出:
#{"測試": 12345, "內容": ["我也不知道我要寫什麼", "123"]}
# <class 'str'>
# {'測試': 12345, '內容': ['我也不知道我要寫什麼', '123']}
# <class 'dict'>

可以從上面輸出中看到 JSON 的雙引號 與python dict的單引號

(2)json.load

json.load用於讀取.json格式的檔案,將JSON檔案 轉化成Python欄位的資料型別

load:針對檔案控制程式碼,將json格式的字元轉換為dict,從檔案中讀取 (將string轉換為dict)

def load(fp, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object."""
with open('abc.json','r',encoding='utf-8')as f:
    py_type_info = json.load(f)
    print(py_type_info)
       with open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "r", encoding='utf-8') as f:
            cmpInfo=json.load(f)

延伸:如果.json檔案中有註釋怎麼辦

參考資料:Pythonh中用json.load() json.loads()載入json資料的方法

提醒:根據JSON規範(http://www.json.org, RFC 4627, RFC 7159),不支援註釋

但如果真的不幸遇到json檔案中有 // 類似的註釋如何解決?

    def load_json(path):   
    import json
    lines = []     #  第一步:定義一個列表, 開啟檔案
    with open(path) as f:  
        for row in f.readlines(): # 第二步:讀取檔案內容 
            if row.strip().startswith("//"):   # 第三步:對每一行進行過濾 
                continue
            lines.append(row)                   # 第四步:將過濾後的行新增到列表中.
    return json.loads("n".join(lines))       #將列表中的每個字串用某一個符號拼接為一整個字串,用json.loads()函數載入,這樣就大功告成啦!!

2.將python物件轉化(序列化)

(1)json.dumps

json.dumps 用於將 Python 物件 編碼成 JSON 字串

注意:這個函數產生的是字串

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
  • obj:轉化成json的物件。
  • skipkeys:預設值是False,如果dict的keys內的資料不是python的基本型別(str,unicode,int,long,float,bool,None),設定為False時,就會報TypeError的錯誤。此時設定成True,則會跳過這類key 。
  • ensure_ascii=True:預設輸出ASCLL碼,如果把這個該成False,就可以輸出中文。
  • check_circular:如果check_circular為false,則跳過對容器型別的迴圈參照檢查,迴圈參照將導致溢位錯誤(或更糟的情況)。
  • allow_nan:如果allow_nan為假,則ValueError將序列化超出範圍的浮點值(nan、inf、-inf),嚴格遵守JSON規範,而不是使用JavaScript等價值(nan、Infinity、-Infinity)。
  • default:default(obj)是一個函數,它應該返回一個可序列化的obj版本或引發型別錯誤。預設值只會引發型別錯誤。
  • sort_keys =True:是告訴編碼器按照字典排序(a到z)輸出。如果是字典型別的python物件,就把關鍵字按照字典排序。
  • indent:引數根據資料格式縮排顯示,讀起來更加清晰。
  • separators:是分隔符的意思,引數意思分別為不同dict項之間的分隔符和dict項內key和value之間的分隔符,把:和,後面的空格都除去了。
	j1={'測試':12345,'內容':['我也不知道我要寫什麼','123']}
    j1_str=json.dumps(j1)
    print(j1)
	# 輸出:{'測試': 12345, '內容': ['我也不知道我要寫什麼', '123']}

(2)json.dump

將Python物件編碼成JSON檔案

j1={'測試':12345,'內容':['我也不知道我要寫什麼','123']}
with open('abc.json','w') as f:
    json.dump(j1,f)

abc.json中寫入了Python物件j1編碼出的json格式資訊:

{"u6d4bu8bd5": 12345, "u5185u5bb9": ["u6211u4e5fu4e0du77e5u9053u6211u8981u5199u4ec0u4e48", "123"]}

總結

到此這篇關於python中json操作之json.loads、json.load、json.jumps及json.jump用法總結的文章就介紹到這了,更多相關python json操作用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com