前言
JSON是什麼?
JSON與XML的優劣差異?
將Python對象編碼成JSON字符串
將JSON字符串解碼為Python對象
解決中文亂碼問題
前言學學Python中操縱JSON的知識。學完本文,你可以學到如下內容:
1、JSON是什麼?
2、JSON與XML的優劣差異?
3、將Python對象編碼成JSON字符串
4、將JSON字符串解碼為Python對象
5、解決JSON中文亂碼問題
JSON是什麼?JSON的全稱是 JavaScript Object Notation,是一種輕量級的數據交換格式。最初,JSON 只是 JavaScript 的子集,但由於其簡單易用而迅速走紅。
現今大部分編程語言都支持對JSON的解析與生成,而近些年異軍突起的NoSQL數據庫也多參照JSON來設計數據存儲格式,例如Mongodb的BSON(Binary JSON)。
JSON有以下六種數據類型:number、boolean、string、null、array、object。前三種很好理解,第四個null對應Python的None,最後兩種,對應Python的列表和字典。
{ "name": "小明", "age": 14, "gender": true, "grade": null, "skills": [ "JavaScript", "Java", "Python" ]}
JSON與XML的優劣差異?在JSON出現之前,人們用XML在網絡上交換數據,在JSON出現後,它基本上就取代了XML的位置。兩者的共同之處顯而易見,它們都是結構化的語言,都可以用於網絡數據的交換。
兩者最大的差異在於它們的“出身”不同,也就是它們被創造的目的不同。
XML是W3C(萬維網聯盟)發布的可擴展標記語言(Extensible Markup Language),最初設計來彌補HTML的不足,以強大的擴展性滿足網絡信息發布的需要,與它“同級”的有:XHTML\CSS\ECMAScript等。它包含DTD、XSD、XPath、XSL等一大堆復雜的規范,在數據存儲、擴展及高級檢索等方面都有作用。後來被用於網絡數據交換,頗有點大材小用的意思,雖然可勝任,卻也有點復雜和冗余。
而JSON是ECMAScript標准的子集,設計之初就是為了克服XML在數據交換上的劣勢,所以一方面,它像XML一樣具有簡潔而清晰的層次結構,另一方面,它比XML小巧精致,更加適用於網絡數據的傳輸。
JSON也不是沒有缺點,當結構層級很多的時候,它會讓人陷入繁瑣復雜的數據節點查找中,在可讀性上要比XML差。
將Python對象編碼成JSON字符串將python的對象轉化為字符串,這個過程也稱為序列化,與之相對,將JSON字符串轉化為python對象,這個過程被稱為反序列化。
序列化格式如下,json.dumps()把python對象序列化,json.dump() 先序列化,然後將內容存入文件:
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 jsonIn [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)
用的比較多的參數有:
ensure_ascii=True 設置是否編碼為ASCII,默認是,若False,則使用原編碼碼格式
indent=None 設置打印時縮進,默認不縮進
separators=None 設置分隔符,取值是(item_separator, dict_separator)元組,默認為(‘,’,’:’),這表示keys之間用“,”隔開,而key和value之間用“:”隔開
sort_keys=False 設置按key值排序,默認不排序
將JSON字符串解碼為Python對象反序列化格式如下,json.loads()從內存中讀取內容解析,json.load() 從文件中讀取內容解析:
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() 多了一個encoding參數,可以將傳入的字符串重新編碼。
解決中文亂碼問題序列化的ensure_ascii參數與反序列化的encoding相對應,都是處理字符編碼,一旦處理不好,就會導致中文亂碼問題。
Python2的字符編碼亂七八糟,也廣被人诟病,如果不幸遇到Python2項目,可參照如下例子解決。
字符串在Python2內部的表示是unicode編碼。因此,在做編碼轉換時,需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(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的默認編碼格式是utf-8,以上例子,只需要ensure_ascii=False,就能解決。
到此這篇關於Python操作JSON實現網絡數據交換的文章就介紹到這了,更多相關 Python操作JSON 內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!