2-3-04-10 内置模块-json-写网站

json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)

# Python中的数据类型的格式
data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
    ('wupeiqi',123),
]

# JSON格式
value = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18},["wupeiqi",123]]'

1.1 核心功能

json格式的作用? 跨语言数据传输

# 为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。

image

Python数据类型与json格式的相互转换

数据类型 -> json ,一般称为:序列化

import json

data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
]

res = json.dumps(data)
print(res) # '[{"id": 1, "name": "\u6b66\u6c9b\u9f50", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'

res = json.dumps(data, ensure_ascii=False)
print(res) # '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'

json格式 -> 数据类型,一般称为:反序列化

import json

data_string = '[{"id": 1, "name": "武沛齐", "age": 18}, {"id": 2, "name": "alex", "age": 18}]'

data_list = json.loads(data_string)

print(data_list)

1.2 类型

python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:

python json
dict object
list, tuple array
str string
int, float number
True true
False false
None null

其他类型如果想要支持,需要自定义JSONEncoder 才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会讲解。】,例如:

import json
from decimal import Decimal
from datetime import datetime

data = [
    {"id": 1, "name": "武沛齐", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
    {"id": 2, "name": "alex", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},
]


class MyJSONEncoder(json.JSONEncoder):
    def default(self, o):
        if type(o) == Decimal:
            return str(o)
        elif type(o) == datetime:
            return o.strftime("%Y-%M-%d")
        return super().default(o)


res = json.dumps(data, cls=MyJSONEncoder)
print(res)

1.3 其他功能

json模块中常用的是:

  • json.dumps,序列化生成一个字符串。
  • json.loads,发序列化生成python数据类型。
  • json.dump,将数据序列化并写入文件(不常用)
import json

data = [
    {"id": 1, "name": "武沛齐", "age": 18},
    {"id": 2, "name": "alex", "age": 18},
]

file_object = open('xxx.json', mode='w', encoding='utf-8')

json.dump(data, file_object)

file_object.close()
  • json.load,读取文件中的数据并反序列化为python的数据类型(不常用)
import json

file_object = open('xxx.json', mode='r', encoding='utf-8')

data = json.load(file_object)
print(data)

file_object.close()

1.4 写网站

写网站,给用户返回json格式数据

安装flask模块,协助我们快速写网站(之前已安装过)

pip3 install flask
  • 使用flask写网站

    import json
    from flask import Flask
    
    app = Flask(__name__)
    
    
    def index():
        return "首页"
    
    
    def users():
        data = [
            {"id": 1, "name": "武沛齐", "age": 18},
            {"id": 2, "name": "alex", "age": 18},
        ]
        return json.dumps(data)
    
    
    app.add_url_rule('/index/', view_func=index, endpoint='index')
    app.add_url_rule('/users/', view_func=users, endpoint='users')
    
    if __name__ == '__main__':
        app.run()
    

发送网络请求,获取json格式数据并处理

   import json
   import requests
   
   url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=5&page_start=20"
   
   res = requests.get(
       url=url,
       headers={
           "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
       }
   )
   
   # json格式
   print(res.text)
   
   # json格式转换为python数据类型
   data_dict = json.loads(res.text)
   print(data_dict)
posted @ 2022-10-26 23:31  布丁家的苏苏  Views(17)  Comments(0)    收藏  举报