目录
Python操作json
python的json模块序列化和反序列化分别是dumps和loads
json.dumps():将一个python对象编码成json串
json.loads():将json格式字符串解码成python对象
json简介
json全称:JavaScript Object Notation(JavaScript对象表示法)
json是存储和交换文本信息的语法;类似xml
json比xml更小、更快、更易解析。
json语法与语法规则
json语法:
json语法是JavaScript语法的子集
json语法规则:
数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
json名称/值对
json数据的书写格式为:"firstName":"John"
json值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null
json对象
写在花括号中,对象可以包含多个名称/值对。比如:{"firstName":"John","lastName":"Doe"}
json数组
是在方括号中书写的,数组可以包含多个对象
{ "employees":
[{"firstName":"John","lastName":"Doe"},
{"firstName":"Peter","lastName":"Jones"}]
}
json编码
使用json.dumps()方法来将一个python数据类型列表编码成json格式的字符串。不过两种语言的类型会存在一些差异,对照表如下:
python数据类型 | json字符串类型 |
dict | object |
list,tuple | array (数组) |
str | string |
int,long,float | number |
True | true |
False | false |
None | null |
代码示例:
>>> import json
>>>data=[{"a":"A","b":(2,4),"C":3.0}]
>>> print ("data",data)
data [{'a': 'A', 'b': (2, 4), 'C': 3.0}]
>>> data_json=json.dumps(data)
>>> print (data_json)
[{"a": "A", "b": [2, 4], "C": 3.0}]
>>> a=[{1:12,"a":12.3},[1,2,3],(1,2),"asd",u"ad",12,2.5]
>>> print ("python类型:\n",a)
python类型:
[{1: 12, 'a': 12.3}, [1, 2, 3], (1, 2), 'asd', 'ad', 12, 2.5]
>>> print ("编码后的json串:\n",json.dumps(a))
编码后的json串:
[{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "asd", "ad", 12, 2.5]
json.dumps():
函数原型如下:(cmd窗口下help(json.dumps))
dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
该方法返回编码后的一个json字符串,是一个str对象encodejson。下面说明几个常用的参数
1.参数sort_keys:
是否按字典排序(a到z)输出。因为默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。
#代码示例:
import json
data=[{"b":3.9,"a":(2,3),"c":"ad"}]
print (json.dumps(data)) #sort_keys默认为False,不进行排序
print (json.dumps(data,sort_keys=True)) #sort_keys为True,进行升序,key必须是同类型
输出结果:
2.参数indent:
设置参数缩进显示的空格数。缩进显示使读起来更加清晰些
#代码示例:
import json
data=[{"b":3.9,"a":(2,3),"c":"ad"}]
print (json.dumps(data,sort_keys=True))
print (json.dumps(data,sort_keys=True,indent=3))
输出结果为:
3.参数separators:
作用是去掉逗号和分号后面的空格,对传输的json串进行压缩,使得传输的数据更加精简;
该参数是元组形式的
#代码示例:
import json
data=[{"b":3.9,"a":(2,3),"c":"ad"}]
print (json.dumps(data))
print (len(json.dumps(data)))
#去掉编码后的json串中 ,和:后面的空格,长度发生变化
print (json.dumps(data,separators=(",",":")))
print (len(json.dumps(data,separators=(",",":"))))
输出结果为:
4.参数skipkeys:
在编码过程中,如果dict对象中的key不是(str,unicode,int,long,float,bool,None)的类型,就会抛出TypeError的异常,skipkeys可以跳过那些非string对象的key处理,就是不处理
#代码示例:
import json
data=[{"b":3.9,12:(2,3),"c":"ad",(1,23):"D tuple"}]
print ("不设置skipkeys参数")
try:
res=json.dumps(data) #默认skipkeys=False
except Exception as e:
print (e)
print ("设置skipkeys参数")
print (json.dumps(data,skipkeys=True))
输出结果为:
5.参数ensure_ascii:
表示编码使用的字符集,默认是True,表示使用ascii码进行编码;如果设置为False,就会以unicode进行编码。由于解码json字符串时返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接编码Unicode字符串,这样会简单些
#代码示例
>>> import json
>>> print (json.dumps("中国"))
"\u4e2d\u56fd"
>>> print (json.dumps("中国",ensure_ascii=False))
"中国"
将类对象编码成json串:
类不是一个可以直接序列化的对象,但我们可以使用dumps()函数中的default参数来实现。
第一种方式:
Employee类首先被obj_json 方法转换成dict,然后再被序列化为json
#代码示例
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("gang",27,"male","1873060****")
print (json.dumps(emp,default=emp.obj_json))
#print (json.dumps(emp.obj_json(emp))) #或者是类的实例调用实例方法
输出结果为:
第二种方式:
通过__dict__属性,通常class及其实例都 会有一个__dict__属性(除非类中添加了__slots__属性),它是一个dict类型,存储的是类或类实例中有效的属性
#代码示例:
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("gang",27,"male",18730603667)
print (emp.__dict__)
print (json.dumps(emp,default=lambda emp:emp.__dict__))
print (json.dumps(emp,default=lambda Employee:Employee.__dict__))
输出结果为:
json解码
json.loads():
将json格式字符串解码成python对象
#代码示例
import json
data=[{"b":3.9,12:(2,3),"c":"ad"}]
data_json=json.dumps(data)
print ("encoding:",data_json)
print ("decoding:",json.loads(data_json))
输出结果为:
从json到Python的类型转化对照表
json字符串类型 | python数据类型 |
object | dict |
array(数组) | list |
string | unicode |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
#代码示例
import json
data=[{"b":3.9,12:(2,3),"c":"ad"},[1,2,3],True,False,None]
data_json=json.dumps(data)
print ("encoding:",data_json)
print ("decoding:",json.loads(data_json))
输出结果为:
json反序列化为类对象
json反序列化为类对象或类实例,使用的是loads()方法中的object_hook参数来实现
#代码示例:
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("gang",27,"male","1873060****")
def JsonToClass(emp):
return (Employee(emp["name"],emp["age"],emp["sex"],emp["tel"]))
json_str='{"name":"Lucy","age":32,"sex":"male","tel":13800138000}'
e=json.loads(json_str,object_hook=JsonToClass) #object_hook等于函数名
print (e) #类实例
print (e.name) #实例属性
输出结果为: