Python 操作json

Json語法規則: 數據在名稱/值對中 數據由逗號分隔 花括號保存對象 方括號保存數組 Json字符串本質上是一個字符串,用單引號表示 Json數據的書寫格式 名稱--值對,包括名稱字段(在雙引號中),後面跟一個冒號,然後是值: “name”: ”zhangsan” 等價於name = “zhangsan” Json值 值可以是 數字(整數或浮點數) 字符串(雙引號括起來) 邏輯值(true或false) 數組(在方括號中) 對象(在花括號中) null Json對象 Json的對象是在大括號中的, {“name”:”zhangsan”,”age”:20} 等價 name=”zhangsan” age = 20 Json數組 Json數組是在中括號中的,數組可以包含多個對象 { "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] } Employees是包含三個對象的數組 編碼Json.dumps() 將一個python對象編碼成json字符串, Python的列表轉換成json數組 >>> json.dumps([1,2,3,"a"]) '[1, 2, 3, "a"]' Python的字符串轉換成json字符串 >>> json.dumps("abc123") '"abc123"' Python元組轉換成json數組 >>> json.dumps((1,2,3,"abc")) '[1, 2, 3, "abc"]' Python的字典轉換成json的對象 >>> json.dumps({1:"a",2:"b",3:"c"}) '{"1": "a", "2": "b", "3": "c"}''#注意1、2、3被加上了雙引號,因爲json的名稱是必須要加雙引號的 Python的數字(int)轉換成json的數字 >>> json.dumps(1235) '1235' Python的unicode字符串轉換成json的字符串 >>> json.dumps(u"abcd") '"abcd"' Python的True轉換成json的true >>> json.dumps(True) 'true' Python的False轉換成json的false >>> json.dumps(False) 'false' Python的None轉換成json的null >>> json.dumps(None) 'null' >>> type(json.dumps("[1,2,3]")) #json本質上是一個字符串 <class 'str'> >>> type(json.dumps("abc")) <class 'str'> Python類型和json類型的對應關係 怎麼判斷一個json 是不是合法的? 用try except try: json.loads('"abc"') except Exception,e: print e else: print "ok" json.dumps()函數參數應用 dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw) 該方法返回編碼後的一個json字符串 sort_keys 是否按key排序,sort_keys = True升序排序 >>> data = [{"a":"A",'d':4,"b":(2,4),"c":3.0}] >>> print(json.dumps(data)) [{"a": "A", "d": 4, "b": [2, 4], "c": 3.0}] >>> print(json.dumps(data,sort_keys=True)) [{"a": "A", "b": [2, 4], "c": 3.0, "d": 4}] indent 設置參數縮進顯示的空格數。縮進顯示使讀起來更加清晰。 >>> import json >>> data = [{"a": "A", "b": [2, 4], "c": 3.0}] >>> print(json.dumps(data,sort_keys=True,indent=4)) [ { "a": "A", "b": [ 2, 4 ], "c": 3.0 } ] Separators 參數的作用是去掉逗號“,”和分號“:”後面的空格,從上面的輸出果都能看到“,”與“:”後面都有個空格,這都是爲了美化輸出結果的作用,但是在我們傳輸數據的過程中,越精簡越好,冗餘的東西全部去掉,因此就可以加上separators參數對傳輸的json串進行壓縮。該參數是元組格式的 >>> import json >>> data = [{"a": "A", "b": [2, 4], "c": 3.0}] >>> print(len(json.dumps(data))) 35 >>> print(len(json.dumps(data,separators=(',',':')))) 29 skipkeys 在encoding過程中,dict對象的key只可以是基本數據類型(str,unicode,int,float,bool,None),如果是其他類型,那麼在編碼過程中就會拋出TypeError的異常。skipkeys可以跳過那些非string對象的key的處理,就是不處理 #coding=utf-8 import json data = [{'a':'A','b':(2,4),'c':3.0,(1,2):'D tuple'}] print(u"不設置skipkeys 參數") try: res1 = json.dumps(data) except Exception as e: print(e) print(u"設置skipkeys 參數") print(json.dumps(data,skipkeys=True)) json.loads() 將一個json字符串解碼成python對象 解碼json對象到python字典 >>> import json >>> json.loads('{"a":1,"b":2}')#注意外面有單引號 {'a': 1, 'b': 2} 解碼json數組到python的列表 >>> json.loads('["a","b",2]') ['a', 'b', 2] 解碼json的字符串到python的字符串 >>> json.loads('"abc"') 'abc' 解碼json的true\false到python的True,False >>> json.loads('true') True >>> json.loads('false') False 解碼json的null到python的None >>> print(json.loads('null')) None 解碼json的數字到python的int、float >>> json.loads('123') 123 >>> json.loads('123.20') 123.2 >>> a =[{1:12,'a':12.3},[1,2,3],(1,2),'abc',u"ab",12] >>> print("編碼後:\n",json.dumps(a)) 編碼後: [{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "abc", "ab", 12] >>> print("解碼後: ",json.loads(json.dumps(a))) 解碼後: [{'1': 12, 'a': 12.3}, [1, 2, 3], [1, 2], 'abc', 'ab', 12] 注意: json格式的字符串解碼成Python對象以後,String類型都變成了str類型,數組變成了list,不會回到原來的元組類型,字典key的字符類型也被轉成字符串類型 從json到python的類型轉換 將類對象編碼成json串 Python中的dict對象可以直接序列化爲json的{},但是很多時候,可能用class表示對象,比如定義Employe類,然後直接去序列化就會報錯。原因是類不是一個可以直接序列化的對象,但我們可以使用dumps()函數中的default參數來實現 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #將序列化函數定義到類裏面 def obj_json(self,obj_instance): return { #返回一個字典 'name' : obj_instance.name, 'age' : obj_instance.age, 'sex' : obj_instance.sex, 'tel' : obj_instance.tel} emp =Employee("Lily",24,"female","18212345678") print(json.dumps(emp,default = emp.obj_json))#編碼成json對象 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #將序列化函數定義到類裏面 def obj_json(self,obj_instance): return { 'name' : obj_instance.name, 'age' : obj_instance.age, 'sex' : obj_instance.sex, 'tel' : obj_instance.tel} emp =Employee("Lily",24,"female","18212345678") print(emp.__dict__) print(json.dumps(emp,default=lambda Employee:Employee.__dict__)) print(json.dumps(emp,default = lambda emp:emp.__dict__)) Json反序列化爲對象 json串反序列化成類對象或類的實例,使用的是loads()方法中的object_hook參數來實現 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #emp = Employee('Lily',24,'female','13112345678') def jsonToClass(emp): return Employee(emp['name'],emp['age'],emp['sex'],emp['tel']) json_str = '{"name":"Lucy","age":21,"sex":"female","tel":"13510163252"}'#需要反序列化的對象 e = json.loads(json_str,object_hook = jsonToClass)#通過loads反序列化得到對象e print(e) print(e.name)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章