python對json的操做總結

  Json簡介:Json,全名 JavaScript Object Notation,是一種輕量級的數據交換格式。Json最普遍的應用是做爲AJAX中web服務器和客戶端的通信的數據格式。如今也經常使用於http請求中,因此對json的各類學習,是天然而然的事情。Python的官網網址:https://docs.python.org/2/library/json.html?highlight=json#module-jsonhtml

  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 下,看到這兩個包(點進去仔細閱讀這些源碼,會有更多的收穫,)以下文所示:python

           

  Python2.6 以上版本支持Json的編碼和解碼,支持python的大部份內置類型與Json進行轉換。最簡單的例子以下所示:web

>>> 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則是生成了一個字符串:json

 

  其餘參數的使用都是同樣的。如下是部分學習的代碼片斷:服務器

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

運行結果以下所示:python2.7

若是把實例中的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']

運行結果:

相關文章
相關標籤/搜索