当前位置: 首页 > 后端技术 > Python

学习如何用Python操作JSON,网络数据交换也不用担心

时间:2023-03-26 18:04:55 Python

学习Python操作JSON的知识。读完本文,您可以学到以下内容:1.什么是JSON?2、JSON和XML的优缺点是什么?3.将Python对象编码为JSON字符串4.将JSON字符串解码为Python对象5.解决JSON中文乱码问题什么是JSON?JSON的全称是JavaScriptObjectNotation,是一种轻量级的数据交换格式。最初,JSON只是JavaScript的一个子集,但由于其简单易用而迅速流行起来。现在的大多数编程语言都支持JSON的解析和生成,近几年兴起的NoSQL数据库也参考了JSON来设计数据存储格式,比如Mongodb的BSON(BinaryJSON)。JSON有以下六种数据类型:number、boolean、string、null、array、object。前三个很好理解,第四个null对应Python的None,后两个对应Python的lists和dictionaries。1{2"姓名":"小明",3"年龄":14,4"性别":true,5"年级":null,6"技能":[7"JavaScript",8"Java",9《Python》10]11}JSON和XML的优缺点是什么?在JSON出现之前,人们使用XML在网络上交换数据。JSON出现后,基本取代了XML。两者的共同点很明显,都是结构化语言,都可以用于网络数据的交换。两者最大的区别在于它们的“出身”不同,即为不同的目的而创造。XML是由W3C(万维网联盟)发布的一种可扩展标记语言(ExtensibleMarkupLanguage)。它的设计初衷是为了弥补HTML的不足,以强大的可扩展性满足网络信息发布的需要。它的“同级”是:XHTML\CSS\ECMAScript等。它包含许多复杂的规范,如DTD、XSD、XPath、XSL等,可用于数据存储、扩展和高级检索。后来用于网络数据交换,有点大材小用了。虽然能干,但也有点复杂和多余。JSON是ECMAScript标准的一个子集。它最初是为了克服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)1In[1]:importjson2In[2]:d=dict(name='Tom',age='8',score=88)3In[3]:json.dumps(d)4Out[3]:'{"name":"Tom","age":"8","score":88}'5In[4]:withopen('test.json','w')asf:6...:json.dump(d,f)使用更多参数:ensure_ascii=True设置编码是否为ASCII,默认Yes,如果为False,则使用原编码编码格式indent=None来打印时设置缩进,默认不缩进separators=None设置分隔符,取值为(item_separator,dict_separator)元组,默认为(',',':'),表示键分隔以“,”分隔,key和value以“:”分隔='Python编程学习圈',age='8',score=88)23In[16]:json.dumps(d)4Out[16]:'{"name":"Python\\u732b","age":"8","score":88}'56In[17]:json.dumps(d,ensure_ascii=False,indent=4,sort_keys=True)7Out[17]:'{\n"age":"8",\n"name":"Python编程学习圈",\n"score":88\n}'89In[18]:print(json.dumps(d,ensure_ascii=False,indent=4,sort_keys=True))10{11"age":"8",12"name":"Python编程学习圈",13"score":8814}将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)1In[1]:importjson2In[2]:d=dict(name='Tom',age='8',score=88)3在[3]中:tom_json=json.转储(d)4In[4]:json.loads(tom_json)5Out[4]:{'age':'8','name':'Tom','score':88}6In[5]:withopen('test.json','r')asf:7...:print(json.load(f))8{'name':'Tom','age':'8','score':88}json.loads()比json.load()多了一个编码参数,可以对传入的字符串进行重新编码,解决中文乱码问题。序列化的ensure_ascii参数对应反序列化的编码,都是处理字符编码。一旦处理失败嘛,就会导致中文乱码。Python2的字符编码比较乱,广受诟病。如果不幸遇到Python2的项目,可以参考下面的例子来解决。Python2中字符串的内部表示是unicode编码。因此,在做编码转换时,需要使用unicode作为中间编码,即先将其他编码的字符串decode(解码)成unicode,再从unicode编码(encode)成另一种编码。1#-*-编码:utf-8-*-2m={'a':'Hello'}34printm5=>{'a':'\xe4\xbd\xa0\xe5\xa5\xbd'}67printjson.dumps(m)8=>{"a":"\u4f60\u597d"}910printjson.dumps(m,ensure_ascii=False)11=>{"a":"拉犲ソ"}1213printjson.dumps(m,ensure_ascii=False).decode('utf8').encode('gb2312')14=>{"a":"Hello"}Python3默认的编码格式是utf-8,上面的例子,只需要ensure_ascii=False,就可以解决。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享

最新推荐
猜你喜欢