python標(biāo)準(zhǔn)庫-json

json簡介

json(javascript object notation) 是一種輕量級的數(shù)據(jù)交換格式,python3中可以使用json模塊來對json數(shù)據(jù)進(jìn)行編解碼
該模塊主要提供了四種方法:

  • dumps
  • dump
  • loads
  • load

dumps 和dump 對python對象進(jìn)行序列化,將一個(gè)python對象進(jìn)行json格式的編碼

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:表示要序列化的對象
  • fp:文件描述符,將序列化的str保存到文件中,json模塊總是生成str對象,而不是字節(jié)對象,因此fp.write()必須支持str輸入
  • skipkey: 默認(rèn)為False,如果skipkeys為True(默認(rèn)值為False),則將跳過不是基本類型(str, int, float, bool, Nose)的dict鍵,不會(huì)引發(fā)TypeError
  • ensure_ascii: 默認(rèn)值為True, 能將所有傳入的非ASCII字符轉(zhuǎn)移輸出,如果ensure_ascii為False,則這些字符將按原樣輸出
  • check_circular:默認(rèn)值為True,如果check_circular為False,則將跳過對容器類型的循環(huán)引用檢查,循環(huán)引用將導(dǎo)致OverflowError
  • allow_nan: 默認(rèn)值為True,如果allow_nan為Flase, 則嚴(yán)格遵守Json規(guī)范,序列化超出范圍的浮點(diǎn)值(nan, inf, -inf)會(huì)引發(fā)ValueError,
    如果allow_nan為True,則將使用它們的JavaScript等銷項(xiàng)(NaN,Infinity, -Infinity)
  • Indent: 設(shè)置縮進(jìn)格式,默認(rèn)值為None,選擇的是最緊湊的表示,如果Indent是非負(fù)整數(shù)或者字符串, 那么json數(shù)組元素對象和成員將
    使用該縮進(jìn)級別進(jìn)行輸入;如果Indent為0、負(fù)數(shù)或者“”,則僅插入換行符;indent使用正整數(shù)縮進(jìn)多個(gè)空格;如果indent是一個(gè)字符串(如“\t”)則該字符串用于縮進(jìn)每個(gè)級別
  • separators: 去除分隔符后面的空格,默認(rèn)值為None,如果指定,則分隔符應(yīng)為(item_separator, key_separator)元組,如果縮進(jìn)為None,則默認(rèn)為(',', ':');要獲得最緊湊的json表示,則可以指定(',',':')以消除空格
  • default: 默認(rèn)值為None, 如果指定,則default應(yīng)該是為無法以其他方式序列化的對象調(diào)用的函數(shù),它應(yīng)返回對象的json可編碼版本
    或引發(fā)TypeError,如果未指定,則引發(fā)TypeError
  • sort_keys: 默認(rèn)值為False,如果sort_keys為True,則字典的輸出將按照鍵值排序
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)

dumps函數(shù)不需要傳文件描述符,其他參數(shù)與dump函數(shù)的一樣

laod 和 loads 反序列化方法, 將json格式數(shù)據(jù)解碼為python對象

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
  • fp: 文件描述符,將fp反序列化為python對象
  • object_hook: 默認(rèn)值為None, object_hook是一個(gè)可選函數(shù),此功能可用于實(shí)現(xiàn)自定義解碼器,指定一個(gè)函數(shù),該函數(shù)負(fù)責(zé)把反序列化后的基本類型對象轉(zhuǎn)換成自定義類型的對象
  • parse_float: 默認(rèn)值為None,如果指定了parse_float, 用來對json float字符串進(jìn)行解碼,這可用于為json浮點(diǎn)數(shù)使用另一種數(shù)據(jù)類型或解析器
  • parse_int: 默認(rèn)值為None,如果指定了parse_int, 用來對json int 字符串進(jìn)行解碼,這可以用于為json整數(shù)使用另一種數(shù)據(jù)類型或解析器
  • parse_constant:默認(rèn)值為None,如果指定了parse_constant,對-Infnity, Infinity,NaN字符串進(jìn)行調(diào)用,如果遇到了無效的json符號,會(huì)引發(fā)異常,如果進(jìn)行反序列化(解碼)的數(shù)據(jù)不是一個(gè)有效的json文檔,將會(huì)引發(fā)jsondecodeerror異常
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
  • s: 將s (包含json文檔的str, bytes或bytearray)反序列化為python對象

  • encoding: 指定一個(gè)編碼的格式

loads也是不需要文件描述符,其他參數(shù)的含義和load函數(shù)一致

json中的數(shù)據(jù)格式與python中的數(shù)據(jù)格式的轉(zhuǎn)化關(guān)系:

Json             Python
object           dict
array            list
string           str
number(int)      int
number(real)     flaot
true/false       true/false
null             None

dump和dumps實(shí)例:

import json

# dumps 可以格式化所有的基本數(shù)據(jù)類型為字符串

data_01 = json.dumps([1, 2, 3])
print(data_01, type(data_01))

data_02 = json.dumps(9)
print(data_02, type(data_02))

data_03 = json.dumps({ "city": 'shenzhen', "age": 18})
print(data_03, type(data_03))


def json_dumps_test(file_path, py_data):
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(json.dumps(py_data, indent=4))
        # json.dump(py_data, f, indent=4)

json_dumps_test('./topic.json', data_03)

load和loads實(shí)例:

json_data = '{"name": "tom", "age": 20}'
py_data_01 = json.loads(json_data)
print(py_data_01, type(py_data_01))

with open("./topic.json", "r", encoding="utf-8") as f:
    py_data_02 = json.loads(f.read())  # load 的傳入?yún)?shù)為字符串類型
    print(py_data_02, type(py_data_02))

常見異常:
直接使用以下方式對多行json文件進(jìn)行讀取

with open("./topic.json", "r", encoding="utf-8") as f:
    py_data_02 = json.loads(f.read())

會(huì)直接拋出JsonDecodeError異常,由于json只能讀取一個(gè)文檔對象,因此我們有兩個(gè)解決辦法:

  • 單行讀取文件,一次讀取一行文件
with open(json_path, 'r') as f:
    for line in f.readlines():
        json_data = json.loads(line)

但這種方法依然有可能會(huì)拋出JsonDecodeError異常,即在json文件中包含空行時(shí),此時(shí)需要先處理空行在進(jìn)行文件讀取操作

  • 將json文件處理為一個(gè)文件對象然后在進(jìn)行讀取文件

小結(jié):

  • json.dumps 將 Python 對象編碼成 JSON 字符串
  • json.loads 將已編碼的 JSON 字符串解碼為 Python 對象
  • json.dump和json.load,需要傳入文件描述符,加上文件操作。
  • JSON內(nèi)部的格式要注意,一個(gè)好的格式能夠方便讀取,可以用indent格式化。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ...JSON又從JavaScript發(fā)展而來,它的語法正好是Python句法的子集。...——《流暢的Pytho...
    浩波千里閱讀 941評論 0 7
  • 常用模塊 認(rèn)識(shí)模塊 什么是模塊 什么是模塊? 常見的場景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文...
    go以恒閱讀 2,167評論 0 6
  • 分層設(shè)計(jì) 把代碼按照不同的功能分別放到不同的子文件夾中進(jìn)行管理,代碼分層。 測試用例模塊:testcases 測試...
    Angiueng閱讀 776評論 0 0
  • 一、python入門 1. python介紹 1.1 python可運(yùn)用范圍 1.1.1 腳本、小工具 1.1.2...
    三觀正_1e5f閱讀 1,449評論 0 10
  • 1. 認(rèn)識(shí)模塊 1.1 什么是模塊 一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文件名就是模塊名字加上.p...
    hswangxun閱讀 693評論 0 1

友情鏈接更多精彩內(nèi)容