Json最廣泛的應用是作為AJAX中web伺服器和客戶端的通訊的資料格式,本篇文章主要介紹了python對json的操作總結,具有一定的參考價值,有興趣的可以了解一下。
Json簡介:Json,全名 JavaScript Object Notation,是一種輕量級的資料交換格式。 Json最廣泛的應用是作為AJAX中web伺服器和客戶端的通訊的資料格式。現在也常用於http請求中,所以對json的各種學習,是自然而然的事。 Python的官網網址:https://docs.python.org/2/library/json.html?highlight=json#module-json
Json API 使用:python在版本2.6之前,是需要先下載包,安裝後才能使用的,有點類似現在的RF內使用SeleniumLibrary一樣。但在2.6中,官方文件(https://docs.python.org/2.6/whatsnew/2.6.html)明顯指出,「有一些重要的新的軟體包添加到了標準庫,例如multiprocessing 和json,但跟隨python 3比,2.6的這些包不會引進更多的新功能。 "於是安裝python2.6以上版本的童鞋,可以不需要下載json包,直接在所需的地方就import json 即可使用,在安裝目錄下的Lib 下,看到這兩個包(點進去仔細閱讀這些源碼,會有更多的收穫,)如下文所示:
#Python2. 6 以上版本支援Json的編碼和解碼,支援python的大部分內建類型與Json進行轉換。最簡單的例子如下:
>>> import json >>> data = {"spam" : "foo", "parrot" : 42} >>> in_json = json.dumps(data) # Encode the data >>> in_json '{"parrot": 42, "spam": "foo"}' >>> json.loads(in_json) # Decode into a Python object {"spam" : "foo", "parrot" : 42}
Encode過程,是把python物件轉換成json物件的一個過程,常用的兩個函數是dumps和dump函數。兩個函數的唯一差別就是dump把python物件轉換成json物件產生一個fp的檔案流,而dumps則是產生了一個字串:
其他參數的使用都是一樣的。以下是部分學習的程式碼片段:
dic1 = {'type':'dic1','username':'loleina','age':16} json_dic1 = json.dumps(dic1) print json_dic1 json_dic2 = json.dumps(dic1,sort_keys=True,indent =4,separators=(',', ': '),encoding="gbk",ensure_ascii=True ) print json_dic2
執行結果如下所示:
如果把實例中的key'username'的value換成中文的“測試”,則用第一次不加參數轉換則會報錯,但是用第二個加參數的就能正常運行。
其實就是對函數的參數的一個理解過程,下面列出幾個常用的參數:
Skipkeys:預設值是False,如果dict的keys內的資料不是python的基本型別(str,unicode,int,long,float,bool,None),設定為False時,就會報TypeError的錯誤。此時設定成True,則會跳過這類key
ensure_ascii:預設值True,如果dict內含有non-ASCII的字符,則會類似\uXXXX的顯示數據,設定成False後,就能正常顯示
indent:應該是一個非負的整型,如果是0,或者為空,則一行顯示數據,否則會換行且按照indent的數量顯示前面的空白,這樣打印出來的json資料也叫pretty-printed json
separators:分隔符,實際上是(item_separator, dict_separator)的一個元組,預設的就是(',',':');這表示dictionary內keys之間用「,」隔開,而KEY和value之間用「:」隔開。
encoding:預設是UTF-8,設定json資料的編碼方式。
sort_keys:將資料依照keys的值進行排序。
Decode過程,是把json物件轉換成python物件的一個過程,常用的兩個函數是loads和load函數。差別跟dump和dumps是一樣的。
if __name__ == '__main__': # 将python对象test转换json对象 test = [{"username":"测试","age":16},(2,3),1] print type(test) python_to_json = json.dumps(test,ensure_ascii=False) print python_to_json print type(python_to_json) # 将json对象转换成python对象 json_to_python = json.loads(python_to_json) print json_to_python print type(json_to_python)
運行結果如下:
从上面2个例子的测试结果可以看到,python的一些基本类型通过encode之后,tuple类型就转成了list类型了,再将其转回为python对象时,list类型也并没有转回成tuple类型,而且编码格式也发生了变化,变成了Unicode编码。具体转化时,类型变化规则如下所示:
Python-->Json
Json-->Python
Json处理中文问题:
关于python字符串的处理问题,如果深入的研究下去,我觉得可以写2篇文章了(实际上自己还没整很明白),在这里主要还是总结下使用python2.7.11处理json数据的问题。前期做接口测试,处理最多的事情就是,把数据组装成各种协议的报文,然后发送出去。然后对返回的报文进行解析,后面就遇到将数据封装在json内嵌入在http的body内发送到web服务器,然后服务器处理完后,返回json数据结果的问题。在这里面就需要考虑json里有中文数据,怎么进行组装和怎么进行解析,以下是基础学习的一点总结:
第一:Python 2.7.11的默认编码格式是ascii编码,而python3的已经是unicode,在学习编解码的时,有出现乱码的问题,也有出现list或者dictionary或者tuple类型内的中文显示为unicode的问题。出现乱码的时候,应该先看下当前字符编码格式是什么,再看下当前文件编码格式是什么,或者没有设置文件格式时,查看下IDE的默认编码格式是什么。最推崇的方式当然是每次编码,都对文件编码格式进行指定,如在文件前 设置# coding= utf-8。
第二:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
第三:将json数据转换成python数据后,一般会得到一个dict类型的变量,此时内部的数据都是unicode编码,所以中文的显示看着很痛苦,但是对于dict得到每个key的value后,中文就能正常显示了,如下所示:
# coding= utf-8 import json import sys if __name__ == '__main__': # 将python对象test转换json对象 test = {"username":"测试","age":16} print type(test) python_to_json = json.dumps(test,ensure_ascii=False) print python_to_json print type(python_to_json) # 将json对象转换成python对象 json_to_python = json.loads(python_to_json) print type(json_to_python) print json_to_python['username']
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多深入理解python對json的操作總結相关文章请关注PHP中文网!