# json模块,讲python数据转换成json数据,或者将json数据转换成python数据
# json格式,本质上是字符串
# 作用:方便各种编程语言之间的数据交互
import json

data = [{'name': '张学友', 'age': '18'}, {'name': '刘德华', 'age': '28'}, (11, 33)]  # python格式
data01 = '[{"name":"zhangxueyou","age":"18"},{"name":"liudehua","age":"28"},[11,33]]'  # json格式,json格式没有小括号(),内部全部双引号

# python格式转json格式,一般成为序列化
data02 = json.dumps(data)
print(
    data02)  # [{"name": "\u5f20\u5b66\u53cb", "age": "18"}, {"name": "\u5218\u5fb7\u534e", "age": "28"}, [11, 33]],中文会转换成Unicode编码

data03 = json.dumps(data, ensure_ascii=False)
print(data03)  # [{"name": "张学友", "age": "18"}, {"name": "刘德华", "age": "28"}, [11, 33]] ,可读性更高

# json格式转python格式,一般称为反序列化
data04 = json.loads(data01)
print(data04)  # [{'name': 'zhangxueyou', 'age': '18'}, {'name': 'liudehua', 'age': '28'}, [11, 33]]

# python转换成json格式的数据要求:字典dict、元组tuple、列表list、字符串str、整形int、浮点型float、布尔值True/False、None
# 非以上类型python数据转换成json格式
from decimal import Decimal
from datetime import datetime

data05 = [{'name': '张学友', 'age': '18', 'size': Decimal('33.33'), 'time': datetime.now()},
          {'name': '刘德华', 'age': '28', 'size': Decimal('77.33'), 'time': datetime.now()}, (11, 33)]


class MyJSONEnconder(json.JSONEncoder):  # 固定搭配
    def default(self, o):
        if type(o) == Decimal:
            return str(o)  # 当数据类型是Decimal的时候,转换成字符串
        elif type(o) == datetime:
            return o.strftime("%Y-%M-%D")  # 当数据类型是时间的时候,获取时间并转换成相应的字符串
        return super().default(o)  # 其他类型按照以前的类型展示


r = json.dumps(data05, cls=MyJSONEnconder, ensure_ascii=False)
print(
    r)  # [{"name": "张学友", "age": "18", "size": "33.33", "time": "2021-24-10/24/21"}, 
# {"name": "刘德华", "age": "28", "size": "77.33", "time": "2021-24-10/24/21"}, [11, 33]]

# json.dump:将数据序列化并写入文件
file_objct = open('xxx.json', mode='w', encoding='utf-8')
json.dump(data, file_objct)
file_objct.close()

# json.load:读取文件数据并反序列化
file_objct = open('xxx.json', mode='r', encoding='utf-8')
data06 = json.load(file_objct)
print(data06)
file_objct.close()