电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python如何讀取、寫入JSON數(shù)據(jù)

瀏覽:55日期:2022-07-16 10:36:37

問題

你想讀寫JSON(JavaScript Object Notation)編碼格式的數(shù)據(jù)。

解決方案

json 模塊提供了一種很簡單的方式來編碼和解碼JSON數(shù)據(jù)。其中兩個主要的函數(shù)是 json.dumps() 和 json.loads() ,要比其他序列化函數(shù)庫如pickle的接口少得多。下面演示如何將一個Python數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為JSON:

import jsondata = { ’name’ : ’ACME’, ’shares’ : 100, ’price’ : 542.23}json_str = json.dumps(data)

下面演示如何將一個JSON編碼的字符串轉(zhuǎn)換回一個Python數(shù)據(jù)結(jié)構(gòu):

data = json.loads(json_str)

如果你要處理的是文件而不是字符串,你可以使用json.dump()和json.load()來編碼和解碼JSON數(shù)據(jù)。例如:

# Writing JSON datawith open(’data.json’, ’w’) as f: json.dump(data, f)# Reading data backwith open(’data.json’, ’r’) as f: data = json.load(f)

討論

JSON編碼支持的基本數(shù)據(jù)類型為None,bool,int,float和str,以及包含這些類型數(shù)據(jù)的lists,tuples和dictionaries。對于dictionaries,keys需要是字符串類型(字典中任何非字符串類型的key在編碼時會先轉(zhuǎn)換為字符串)。為了遵循JSON規(guī)范,你應(yīng)該只編碼Python的lists和dictionaries。而且,在web應(yīng)用程序中,頂層對象被編碼為一個字典是一個標(biāo)準(zhǔn)做法。

JSON編碼的格式對于Python語法而已幾乎是完全一樣的,除了一些小的差異之外。比如,True會被映射為true,F(xiàn)alse被映射為false,而None會被映射為null。下面是一個例子,演示了編碼后的字符串效果:

>>> json.dumps(False)’false’>>> d = {’a’: True,... ’b’: ’Hello’,... ’c’: None}>>> json.dumps(d)’{'b': 'Hello', 'c': null, 'a': true}’>>>

如果你試著去檢查JSON解碼后的數(shù)據(jù),你通常很難通過簡單的打印來確定它的結(jié)構(gòu),特別是當(dāng)數(shù)據(jù)的嵌套結(jié)構(gòu)層次很深或者包含大量的字段時。為了解決這個問題,可以考慮使用pprint模塊的 pprint() 函數(shù)來代替普通的 print() 函數(shù)。它會按照key的字母順序并以一種更加美觀的方式輸出。下面是一個演示如何漂亮的打印輸出Twitter上搜索結(jié)果的例子:

>>> from urllib.request import urlopen>>> import json>>> u = urlopen(’http://search.twitter.com/search.json?q=python&rpp=5’)>>> resp = json.loads(u.read().decode(’utf-8’))>>> from pprint import pprint>>> pprint(resp){’completed_in’: 0.074,’max_id’: 264043230692245504,’max_id_str’: ’264043230692245504’,’next_page’: ’?page=2&max_id=264043230692245504&q=python&rpp=5’,’page’: 1,’query’: ’python’,’refresh_url’: ’?since_id=264043230692245504&q=python’,’results’: [{’created_at’: ’Thu, 01 Nov 2012 16:36:26 +0000’, ’from_user’: ... }, {’created_at’: ’Thu, 01 Nov 2012 16:36:14 +0000’, ’from_user’: ... }, {’created_at’: ’Thu, 01 Nov 2012 16:36:13 +0000’, ’from_user’: ... }, {’created_at’: ’Thu, 01 Nov 2012 16:36:07 +0000’, ’from_user’: ... } {’created_at’: ’Thu, 01 Nov 2012 16:36:04 +0000’, ’from_user’: ... }],’results_per_page’: 5,’since_id’: 0,’since_id_str’: ’0’}>>>

一般來講,JSON解碼會根據(jù)提供的數(shù)據(jù)創(chuàng)建dicts或lists。如果你想要創(chuàng)建其他類型的對象,可以給 json.loads() 傳遞object_pairs_hook或object_hook參數(shù)。例如,下面是演示如何解碼JSON數(shù)據(jù)并在一個OrderedDict中保留其順序的例子:

>>> s = ’{'name': 'ACME', 'shares': 50, 'price': 490.1}’>>> from collections import OrderedDict>>> data = json.loads(s, object_pairs_hook=OrderedDict)>>> dataOrderedDict([(’name’, ’ACME’), (’shares’, 50), (’price’, 490.1)])>>>

下面是如何將一個JSON字典轉(zhuǎn)換為一個Python對象例子:

>>> class JSONObject:... def __init__(self, d):... self.__dict__ = d...>>>>>> data = json.loads(s, object_hook=JSONObject)>>> data.name’ACME’>>> data.shares50>>> data.price490.1>>>

最后一個例子中,JSON解碼后的字典作為一個單個參數(shù)傳遞給 __init__() 。然后,你就可以隨心所欲的使用它了,比如作為一個實(shí)例字典來直接使用它。

在編碼JSON的時候,還有一些選項(xiàng)很有用。如果你想獲得漂亮的格式化字符串后輸出,可以使用 json.dumps() 的indent參數(shù)。它會使得輸出和pprint()函數(shù)效果類似。比如:

>>> print(json.dumps(data)){'price': 542.23, 'name': 'ACME', 'shares': 100}>>> print(json.dumps(data, indent=4)){ 'price': 542.23, 'name': 'ACME', 'shares': 100}>>>

對象實(shí)例通常并不是JSON可序列化的。例如:

>>> class Point:... def __init__(self, x, y):... self.x = x... self.y = y...>>> p = Point(2, 3)>>> json.dumps(p)Traceback (most recent call last): File '<stdin>', line 1, in <module> File '/usr/local/lib/python3.3/json/__init__.py', line 226, in dumps return _default_encoder.encode(obj) File '/usr/local/lib/python3.3/json/encoder.py', line 187, in encode chunks = self.iterencode(o, _one_shot=True) File '/usr/local/lib/python3.3/json/encoder.py', line 245, in iterencode return _iterencode(o, 0) File '/usr/local/lib/python3.3/json/encoder.py', line 169, in default raise TypeError(repr(o) + ' is not JSON serializable')TypeError: <__main__.Point object at 0x1006f2650> is not JSON serializable>>>

如果你想序列化對象實(shí)例,你可以提供一個函數(shù),它的輸入是一個實(shí)例,返回一個可序列化的字典。例如:

def serialize_instance(obj): d = { ’__classname__’ : type(obj).__name__ } d.update(vars(obj)) return d

如果你想反過來獲取這個實(shí)例,可以這樣做:

# Dictionary mapping names to known classesclasses = { ’Point’ : Point}def unserialize_object(d): clsname = d.pop(’__classname__’, None) if clsname: cls = classes[clsname] obj = cls.__new__(cls) # Make instance without calling __init__ for key, value in d.items(): setattr(obj, key, value) return obj else: return d

下面是如何使用這些函數(shù)的例子:

>>> p = Point(2,3)>>> s = json.dumps(p, default=serialize_instance)>>> s’{'__classname__': 'Point', 'y': 3, 'x': 2}’>>> a = json.loads(s, object_hook=unserialize_object)>>> a<__main__.Point object at 0x1017577d0>>>> a.x2>>> a.y3>>>

json 模塊還有很多其他選項(xiàng)來控制更低級別的數(shù)字、特殊值如NaN等的解析。可以參考官方文檔獲取更多細(xì)節(jié)。

以上就是Python如何讀取、寫入JSON數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Python讀寫json數(shù)據(jù)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 方源木业官网-四川木门-全国木门专业品牌 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 上海乾拓贸易有限公司-日本SMC电磁阀_德国FESTO电磁阀_德国FESTO气缸 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] |