python參考:http://docs.python.org/library/json.html
JSON:一種輕量級數據交換格式,相對于XML而言更簡單筷登,也易于閱讀和編寫,機器也方便解析和生成哩盲,Json是JavaScript中的一個子集前方。
python 2.6開始加入了json的模塊,python對json的處理分別是編碼和解碼
encoding:把一個Python對象編碼轉換成Json字符串-->json.dumps
decoding:把Json格式字符串解碼轉換成Python對象-->json.loads
對數據類型(string廉油、int惠险、float、list抒线、tuple班巩、dict),python可以直接處理
import json
dict =(['A', {'B': ('C', None, 1.0, 2)}])
print(json.dumps(dict))
輸出:
["A", {"B": ["C", null, 1.0, 2]}]
json.dumps:
python | json |
---|---|
dict | object |
llist嘶炭、tuple | array |
string | string |
int抱慌、number、float | number |
True | ture |
None | null |
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)
python | json |
---|---|
skipkeys | 默認是false,編碼中key如果不是基本類型(str眨猎、int抑进、float、bool睡陪、None)寺渗,軟件會報錯,如果是true宝穗,則忽略key的顯示 |
ensure_ascii | 表示編碼使用的字符集户秤,默認是是True,表示使用ascii碼進行編碼逮矛。如果設置為False鸡号,就會以Unicode進行編碼 |
check_circular | 默認是true,檢查類型是否存在循環(huán)引用须鼎,如果存在這類型的引用鲸伴,則被省略 |
allow_nan | 序列化的時候超過float值的范圍府蔗,那么將用(,Infinity,NAN)代替 |
indent | 設置參數縮進顯示的空格數」埃縮進顯示使讀起來更加清晰 |
separators | 參數的作用是去掉逗號“,”和分號“:”后面的空格姓赤,從上面的輸出 結果都能看到“,”與“:”后面都有個空格 |
sort_keys | 默認是fasle,不按照key的assic碼排序 |
dict =[1,2,3,{'中國': 1.000000122221111111111111111111111111111111111111111000000008, '6': 7}],
print(json.dumps(dict))
print(json.dumps(dict,separators=(',',':'),ensure_ascii = False,indent=1))
輸入如下
[[1, 2, 3, {"\u4e2d\u56fd": 1.000000122221111, "6": 7}]]
[
[
1,
2,
3,
{
"中國":1.000000122221111,
"6":7
}
]
]
python對類對象序列化json
class person():
def __init__(self,__name,__age):
self.__name =__name
self.__age = __age
def getName(self):
return self.__name
def setName(self,__value):
self.__name = __value
def delName(self):
del self.__name
name =property(getName,setName,delName)
def getAge(self):
return self.__age
def setAge(self,__value):
self.__age = __value
age = property(setAge,getAge)
limei = person('limei',24)
print(json.dumps(limei))# 報錯
把person的類轉化為json仲吏,如果使用json.dumps(limei),python會解析出錯不铆。原因是Object of type 'person' is not JSON serializable,所以需要dumps()實現default.這個參數接受一個函數裹唆,這個函數可以將對象轉換為字典誓斥。
def obj_json( obj_instance):
return { 'name': obj_instance.name, 'age': obj_instance.age}
print(json.dumps(limei,default=obj_json))
輸出如下
{"name": "limei", "age": 24}
上面的方法如果對于多參數的類來說,這個方法確實很麻煩许帐。python中對象實例有個方法可以簡化這一過程劳坑。直接調用實例的dict
print(limei.__dict__)
輸出如下
{'_person__name': 'limei', '_person__age': 24}
所以可以重寫一下obj_json:
def obj_json( obj_instance):
return obj_instance.__dict__
上面的代碼也可以使用lambda的方法編寫。
class person():
def __init__(self,__name,__age):
self.__name =__name
self.__age = __age
def getName(self):
return self.__name
def setName(self,__value):
self.__name = __value
def delName(self):
del self.__name
name =property(getName,setName,delName)
def getAge(self):
return self.__age
def setAge(self,__value):
self.__age = __value
age = property(getAge,setAge)
limei = person('limei',24)
print(json.dumps(limei,default=lambda person:person.__dict__))
私有的方法:
def converageObject(clz):
dict = {}
for key in clz.__dict__.keys():
temp_key = key.split("_")[-1]
dict[temp_key]=clz.__dict__.get(key)
return dict