标准json
json(javascript object notation,js对象标记法),是js对象的字符串表示形式。包含两种数据结构:1.对象 ??2.数组
对象使用 { } 包裹,里面是无序的 K/V 键值对,键值之间 : 分割,键值对之间 , 分割。键只能为双引号包裹的字符串类型,值可以为4种基本数据类型(字符串型/数值型/布尔型/null)和2中引用数据类型(对象/数组),值为字符串型的时候也必须使用双引号包裹。
数组使用 [ ] 包裹, 元素之间 , 分割,元素可以为字符串型/数值型/布尔型/null/对象/数组,为字符串时也同样需要双引号包裹。
python中json模块的使用
python中的json模块主要有4个方法:dumps/ loads/ dump/ load
- dumps:将python中对象转为符合json格式的字符串
- loads:将符合json格式的字符串转为python对象
- dump:将python对象转为json字符串,并写入到文件
- load:从文件中读取json字符串并将其转为python对象
两个不带s的方法只是在带s方法的基础上多了一个json字符串与文件之间的读写的过程。
dumps
import json
obj = [{"name": "小帅", "age": 22}, [1, 1.23], (True, False), None]
res = json.dumps(obj)
print("值:{0}\n类型:{1}".format(res, type(res)))
dumps方法的参数列表: obj:要转成json字符串的python对象 *:无意义,表示后面的参数传递时必须指定参数名传递 ensure_ascii:等于True时会对obj中所有非ascii码字符转义成对应的unicode字符,所以上面的中文变成了类似 “\u5c0f\u5e051” 这种格式,设为False时原样保存
loads
import json
json_str = '[{"name": "小帅", "age": 22}, [1, 1.23], true, false, null, "2022-05-10"]'
res = json.loads(json_str)
print("值:{0}\n类型:{1}".format(res, type(res)))
loads方法的参数列表:
dump/load
和上面各自对应的方法功能参数都类似,只是多了个文件操作,从文件读,写入到文件。
使用dump序列化python对象到文件:
import json
obj = [{"name": "小帅", "age": 22}, [1, 1.23], (True, False), None]
with open("test.json", "a", encoding="utf-8") as f:
json.dump(obj, f)
使用load从文件反序列化到python对象:
import json
with open("test.json", "r", encoding="utf-8") as f:
res = json.load(f)
print("值:{0}\n类型:{1}".format(res, type(res)))
dumps序列化时间日期时报错
dumps在对python中的日期时间数据类型转化为字符串的时候会报错:
import json
from datetime import date
today = date.today()
obj = [today]
res = json.dumps(obj)
print("值:{0}\n类型:{1}".format(res, type(res)))
在stackoverflow上找到了2种解决方法: 1.调用dumps的时候将内置函数str赋值给default参数。json.dumps(obj, default=str) 2. 第二种是新写一个新类NewEncoder继承JSONEncoder类,重写里面的default方法,并在调用dumps的时候通过cls参数指定新类。json.dumps(obj, cls=NewEncoder) 下面的官方文档给出了怎么拓展JSONEncoder类:
class NewEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj)
json与python数据类型对照
截自源码
|