Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換
前言
學(xué)學(xué)Python中操縱JSON的知識(shí)。學(xué)完本文,你可以學(xué)到如下內(nèi)容:
- 1、JSON是什么?
- 2、JSON與XML的優(yōu)劣差異?
- 3、將Python對(duì)象編碼成JSON字符串
- 4、將JSON字符串解碼為Python對(duì)象
- 5、解決JSON中文亂碼問(wèn)題
JSON是什么?
JSON的全稱是 JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式。最初,JSON 只是 JavaScript 的子集,但由于其簡(jiǎn)單易用而迅速走紅。
現(xiàn)今大部分編程語(yǔ)言都支持對(duì)JSON的解析與生成,而近些年異軍突起的NoSQL數(shù)據(jù)庫(kù)也多參照J(rèn)SON來(lái)設(shè)計(jì)數(shù)據(jù)存儲(chǔ)格式,例如Mongodb的BSON(Binary JSON)。
JSON有以下六種數(shù)據(jù)類型:number、boolean、string、null、array、object。前三種很好理解,第四個(gè)null對(duì)應(yīng)Python的None,最后兩種,對(duì)應(yīng)Python的列表和字典。
{ "name": "小明", "age": 14, "gender": true, "grade": null, "skills": [ "JavaScript", "Java", "Python" ] }
JSON與XML的優(yōu)劣差異?
在JSON出現(xiàn)之前,人們用XML在網(wǎng)絡(luò)上交換數(shù)據(jù),在JSON出現(xiàn)后,它基本上就取代了XML的位置。兩者的共同之處顯而易見(jiàn),它們都是結(jié)構(gòu)化的語(yǔ)言,都可以用于網(wǎng)絡(luò)數(shù)據(jù)的交換。
兩者最大的差異在于它們的“出身”不同,也就是它們被創(chuàng)造的目的不同。
XML是W3C(萬(wàn)維網(wǎng)聯(lián)盟)發(fā)布的可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language),最初設(shè)計(jì)來(lái)彌補(bǔ)HTML的不足,以強(qiáng)大的擴(kuò)展性滿足網(wǎng)絡(luò)信息發(fā)布的需要,與它“同級(jí)”的有:XHTML\CSS\ECMAScript等。它包含DTD、XSD、XPath、XSL等一大堆復(fù)雜的規(guī)范,在數(shù)據(jù)存儲(chǔ)、擴(kuò)展及高級(jí)檢索等方面都有作用。后來(lái)被用于網(wǎng)絡(luò)數(shù)據(jù)交換,頗有點(diǎn)大材小用的意思,雖然可勝任,卻也有點(diǎn)復(fù)雜和冗余。
而JSON是ECMAScript標(biāo)準(zhǔn)的子集,設(shè)計(jì)之初就是為了克服XML在數(shù)據(jù)交換上的劣勢(shì),所以一方面,它像XML一樣具有簡(jiǎn)潔而清晰的層次結(jié)構(gòu),另一方面,它比XML小巧精致,更加適用于網(wǎng)絡(luò)數(shù)據(jù)的傳輸。
JSON也不是沒(méi)有缺點(diǎn),當(dāng)結(jié)構(gòu)層級(jí)很多的時(shí)候,它會(huì)讓人陷入繁瑣復(fù)雜的數(shù)據(jù)節(jié)點(diǎn)查找中,在可讀性上要比XML差。
將Python對(duì)象編碼成JSON字符串
將python的對(duì)象轉(zhuǎn)化為字符串,這個(gè)過(guò)程也稱為序列化,與之相對(duì),將JSON字符串轉(zhuǎn)化為python對(duì)象,這個(gè)過(guò)程被稱為反序列化。
序列化格式如下,json.dumps()把python對(duì)象序列化,json.dump() 先序列化,然后將內(nèi)容存入文件:
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) 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)
In [1]: import json In [2]: d = dict(name='Tom', age='8', score=88) In [3]: json.dumps(d) Out[3]: '{"name": "Tom", "age": "8", "score": 88}' In [4]: with open('test.json', 'w') as f: ...: json.dump(d, f)
用的比較多的參數(shù)有:
- ensure_ascii=True 設(shè)置是否編碼為ASCII,默認(rèn)是,若False,則使用原編碼碼格式
- indent=None 設(shè)置打印時(shí)縮進(jìn),默認(rèn)不縮進(jìn)
- separators=None 設(shè)置分隔符,取值是(item_separator, dict_separator)元組,默認(rèn)為(‘,’,’:’),這表示keys之間用“,”隔開(kāi),而key和value之間用“:”隔開(kāi)
- sort_keys=False 設(shè)置按key值排序,默認(rèn)不排序
將JSON字符串解碼為Python對(duì)象
反序列化格式如下,json.loads()從內(nèi)存中讀取內(nèi)容解析,json.load() 從文件中讀取內(nèi)容解析:
json.loads(s,
, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None,
*kw)
json.load(fp,
, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None,
*kw)
In [1]: import json2In [2]: d = dict(name='Tom', age='8', score=88) In [3]: tom_json = json.dumps(d) In [4]: json.loads(tom_json) Out[4]: {'age': '8', 'name': 'Tom', 'score': 88} In [5]: with open('test.json', 'r') as f: ...: print(json.load(f)) {'name': 'Tom', 'age': '8', 'score': 88}
json.loads()比json.load() 多了一個(gè)encoding參數(shù),可以將傳入的字符串重新編碼。
解決中文亂碼問(wèn)題
序列化的ensure_ascii參數(shù)與反序列化的encoding相對(duì)應(yīng),都是處理字符編碼,一旦處理不好,就會(huì)導(dǎo)致中文亂碼問(wèn)題。
Python2的字符編碼亂七八糟,也廣被人詬病,如果不幸遇到Python2項(xiàng)目,可參照如下例子解決。
字符串在Python2內(nèi)部的表示是unicode編碼。因此,在做編碼轉(zhuǎn)換時(shí),需要以u(píng)nicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼。
# -*- coding: utf-8 -*- m = {'a' : '你好'} print m =>{'a': '\xe4\xbd\xa0\xe5\xa5\xbd'} print json.dumps(m) =>{"a": "\u4f60\u597d"} print json.dumps(m,ensure_ascii=False) =>{"a": "浣犲ソ"} print json.dumps(m,ensure_ascii=False).decode('utf8').encode('gb2312') =>{"a": "你好"}
Python3的默認(rèn)編碼格式是utf-8,以上例子,只需要ensure_ascii=False,就能解決。
到此這篇關(guān)于Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換的文章就介紹到這了,更多相關(guān) Python操作JSON 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
這篇文章主要介紹了Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實(shí)例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python中使用iterrows()對(duì)dataframe進(jìn)行遍歷的實(shí)例
今天小編就為大家分享一篇python中使用iterrows()對(duì)dataframe進(jìn)行遍歷的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python獲取二維數(shù)組的行列數(shù)的2種方法
這篇文章主要介紹了Python獲取二維數(shù)組的行列數(shù)的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python與sqlite3實(shí)現(xiàn)解密chrome cookie實(shí)例代碼
這篇文章主要介紹了python與sqlite3實(shí)現(xiàn)解密chrome cookie實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01