Python中json模块的使用

标准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}
类型:{1}".format(res, type(res)))

dumps方法的参数列表: obj:要转成json字符串的python对象 *:无意义,表示后面的参数传递时必须指定参数名传递 ensure_ascii:等于True时会对obj中所有非ascii码字符转义成对应的unicode字符,所以上面的中文变成了类似 “u5c0fu5e051” 这种格式,设为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}
类型:{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}
类型:{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}
类型:{1}".format(res, type(res)))

在上找到了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数据类型对照

截自源码

经验分享 程序员 微信小程序 职场和发展