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}\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数据类型对照

截自源码
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值