Python 操作json
阿新 • • 發佈:2019-03-27
__init__ python對象 error self ngs 字典 pytho hang 類型轉換
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)
Python 操作json