Python_json的简单说明
Json的简单说明
1、json的简介
网络传输的本质,服务器a——服务器b(本身是以字节传输的)
Soap:简单对象传输协议
#coding=utf-8 import json data = [{'a':"A",'b':(2,4),'c':3.0}] res = repr(data) print("data :", res) data_json = json.dumps(data) print(data_json)
如下的转化是不可逆的
2、Python和json的数据类型的区别
#coding=utf-8 import json a = [{1:12,"a":12.3}, [1,2,3],(1,2), "asd", "ad", 12,13,3.3,True, False, None] print("Python类型:\n", a) print("编码后的json串:\n", json.dumps(a))
3、可以进行自动的排序
>>> #coding=utf-8 ... import json >>> >>> data = [ { 'a':'A', 'x':(2, 4), 'c':3.0,"b":"4" },] >>> print(json.dumps(data)) [{"a": "A", "x": [2, 4], "c": 3.0, "b": "4"}] >>> print(json.dumps(data, sort_keys=True)) [{"a": "A", "b": "4", "c": 3.0, "x": [2, 4]}]
>>> data = { 'a':'A', 'x':(2, 4), 'c':3.0,"b":"4" } >>> print(json.dumps(data, sort_keys=True)) {"a": "A", "b": "4", "c": 3.0, "x": [2, 4]}
4、会有展示的格式(indent=3指定缩进3个空格)
>>> data = [{"a": "A", "b": [2, 4], "c": 3.0}] >>> print(json.dumps(data, sort_keys=True, indent=3)) [ { "a": "A", "b": [ 2, 4 ], "c": 3.0 } ]
5、去掉空格(:和,后的空格)
#separators=(',',':') >>> data=[{"a": "A", "b": [2,4], "c":3.0}] >>> print(len(json.dumps(data))) 35 >>> print(len(json.dumps(data,separators=(',',':')))) 29 >>>
6、转换格式失败设置过滤(skipkeys参数)
(1,2)不能被设置为key
skipkeys参数默认为False
#(1,2)不能被设置为key #(skipkeys=True)表示会过滤掉出错的 #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) #skipkeys参数默认为False时 except Exception as e: print(e) print(u"设置skipkeys 参数") print(json.dumps(data, skipkeys=True))# skipkeys=True时
7、Json格式和字典类型的互转(ensure_ascii参数)
ensure_ascii默认为True
>>> import json >>> print (json.dumps('中国’)) "\u4e2d\u56fd" >>> print (json.dumps('中国',ensure_ascii=False)) "中国" >>> print (json.dumps("中国")) "\u4e2d\u56fd"
(1)转换之后是乱码的处理
>>> print (json.dumps({"中国":"光荣之路"})) {"\u4e2d\u56fd": "\u5149\u8363\u4e4b\u8def"} >>> print (json.dumps({"中国":"光荣之路"},ensure_ascii=False)) {"中国": "光荣之路"}
(2)Json——Dict(json转化为字典)
>>> #coding=utf-8 ... import json >>> data = [{'a':"Aasdf",'b':(2,4),'c':3.0}] >>> data_json = json.dumps(data) >>> print("encoding :", data_json) encoding : [{"a": "Aasdf", "b": [2, 4], "c": 3.0}] >>> print("decoding :", json.loads(data_json)) decoding : [{'a': 'Aasdf', 'b': [2, 4], 'c': 3.0}]
bytes类型不能转换为json格式的数据
Socket协议传输的时候只能用bytes类型的数据
8、类对象编码成json串
方法一:
#encoding=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', '18223423423') print(json.dumps(emp, default = emp.obj_json))
方法二:
#encoding=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', '18223423423') print(emp.__dict__)#__dict__实例的所有属性 print(json.dumps(emp, default = lambda Employee: Employee.__dict__)) print(json.dumps(emp, default = lambda emp: emp.__dict__))
9、反序列化
#encoding=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', '18223423423') def jsonToClass(emp): return Employee(emp['name'], emp['age'], emp['sex'], emp['tel']) json_str = '{"name": "Lucy", "age": 21, "sex": "female", "tel": "15834560985"}' e = json.loads(json_str, object_hook = jsonToClass) print(e) print(e.name)