• 【python】JSON标准库文件介绍及python中json模块使用


    ​​

    活动地址:CSDN21天学习挑战赛

    目录

    1.  JSON简介

    2. JSON语法格式

    3. python中的json模块

    3.1 python数据类型与json数据类型转换

    3.2 json模块常用函数

    3.2.1 json.dumps()函数  python  ->  json

     3.2.2 json.dump()函数 python  ->  json 并保存到文件中

    3.2.3 json.loads()  json -> python

    3.2.4 json.load()  读取json文件并转换为python

    3.3 解析JSON字串或文件


    **

    学习日记 Day2

    **

    1.  JSON简介

    JSON,Java Script Object Notation,是一种轻量级的文本数据交换格式,JSON独立于语言,具有自我描述性,更易理解;JSON比XML更小、更快、更易解析;爬虫经常获取的接口数据就是JSON格式。

    JSON数据格式类似python的字典格式,里面包括方括号括起来的数组,类似python里的列表。

    2. JSON语法格式

    语法格式:{key1:value1, key2:value2},如果value表示的数据有很多,用方括号括起来[],称为数组。

    JSON是键值对形式构成的,键的部分必须用双引号包裹 "",值的部分,不允许出现函数function,undefined,NaN,但可以有null,不允许出现没有意义的逗号。

    如下:

    格式1:JSON 对象

    1. {
    2. "name" : "Jack",
    3. "age" : 18
    4. }

    格式2:JSON数组

    1. {
    2. "student":
    3. [
    4. {"name" : "Jack", "age" : 18},
    5. {"name" : "Lucy", "age" : 18}
    6. ],
    7. "classroom" : {
    8. "class1" : "room1",
    9. "class2" : "room2"
    10. }
    11. }

    3. python中的json模块

    python提供了json模块,作用是使用JSON字符串生成python对象(load),或由python对象格式化成json字符串(dump)。

    使用时需要导入模块:import json

    3.1 python数据类型与json数据类型转换

    python -> json时,数据类型会有变化,如下:

    PythonJSON
    dictobject
    list,tuplearray
    strstring
    int,float,int-&,float-derived Enumsnumber
    Truetrue
    Falsefalse
    Nonenull

    json -> python,转换时数据类型变化如下:

    JSONPython
    objectdict
    arraylist
    stringstr
    number(int)int
    number(real)float
    trueTrue
    falseFalse
    nullNone

    3.2 json模块常用函数

    方法功能
    json.dumps(obj)将python数据类型转换为json格式的字符串
    json.dump(obj,fp)将python数据类型转换并保存到json格式的文件内
    json.loads(s)将json格式的字符串转换为python的类型
    json.load(fp)从json格式的文件中读取数据并转换为python的类型

    3.2.1 json.dumps()函数  python  ->  json

    json.dumps()函数将python数据类型转换为json格式的字符串。

    1. json.dumps(obj,*,
    2. skipkeys=False, # 是否允许JSON字串编码字典对象时,字典的key不是字符串类型(默认不允许)
    3. ensure_ascii=True,
    4. check_circular=True,
    5. allow_nan=True,
    6. cls=None,
    7. indent=None, # 定义缩进
    8. separators=None, # 是一个元组,定义分隔符的类型
    9. default=None,
    10. sort_keys=False, # 是否排序
    11. **kw)

    使用示例1:将python字典转换为json字符串

    1. import json
    2. # python 字典
    3. p_persopn = {"name":"jack",
    4. "age":18 ,
    5. "tel":["666888",'12312341234'],
    6. "isOnly":True
    7. }
    8. print("python: ",p_persopn)
    9. # 转换为json字符串
    10. j_person = json.dumps(p_persopn)
    11. print("JSON: ",j_person)

    显示结果:

    python:  {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
    python
    JSON:  {"name": "jack", "age": 18, "tel": ["666888", "12312341234"], "isOnly": true}
    JSON

    从结果中可以看出,python打印的是单引号,数据类型是字典,True首字母大写;json打印的是双引号,数据类型是字符串,true全部小写。

    使用示例2:格式化输出json字串:

    1. import json
    2. # python 字典
    3. p_persopn = {"name":"jack",
    4. "age":18 ,
    5. "tel":["666888",'12312341234'],
    6. "isOnly":True
    7. }
    8. print("python: ",p_persopn)
    9. # 格式化输出json字串
    10. j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
    11. print("格式化输出JSON:",j_person)
    12. j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=('!','='))
    13. print("格式化输出JSON:",j_person)

    显示结果:

    python:  {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
    格式化输出JSON: {
        "age":18,
        "isOnly":true,
        "name":"jack",
        "tel":[
            "666888",
            "12312341234"
        ]
    }
    格式化输出JSON: {
        "age"=18!
        "isOnly"=true!
        "name"="jack"!
        "tel"=[
            "666888"!
            "12312341234"
        ]
    }

    可以看出定义的separators元组的第一个元素是json中每个键值对之间的分隔符,元组的第二个元素是json中键值对之间的分隔符。

    使用示例3:将python字串转换为json字串后存入文件

    1. import json
    2. # 保存json文件
    3. p_persopn = {"name":"jack",
    4. "age":18 ,
    5. "tel":["666888",'12312341234'],
    6. "isOnly":True
    7. }
    8. print("python: ",p_persopn)
    9. j_person = json.dumps(p_persopn)
    10. with open('test.json','w',encoding='utf-8') as f: # 打开文件
    11. f.write(j_person) # 写入文件
    12. print("保存json文件完成!")
    13. j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
    14. with open('test_format.json','w',encoding='utf-8') as f: # 打开文件
    15. f.write(j_person) # 写入文件
    16. print("保存json文件完成!")

    显示结果,新生成的文件:

     3.2.2 json.dump()函数 python  ->  json 并保存到文件中

    json.dump()函数:

    1. json.dump(obj,fp,*,
    2. skipkeys=False,
    3. ensure_ascii=True,
    4. check_circular=True,
    5. allow_nan=True,
    6. cls=None,
    7. indent=None,
    8. separators=None,
    9. default=None,
    10. sort_keys=False,
    11. **kw
    12. )

    使用示例1:python格式转换为json格式并保存到文件中

    1. import json
    2. # python -> json 并保存文件
    3. p_persopn = {"name":"jack",
    4. "age":18 ,
    5. "tel":["666888",'12312341234'],
    6. "isOnly":True
    7. }
    8. json.dump(p_persopn,open("data.json","w"))
    9. # 格式化保存python转换的json
    10. json.dump(p_persopn,open("data_format.json","w"),sort_keys=True,indent=4,separators=(',',':'))

    生成的文件显示:

     json.dumps()和json.dump()比较:

    • dump()不需要使用.write()方法,只需要传入字典,要写的文件即可;dumps()函数需要使用.write()方法写入数据;
    • 如果把字典写入到文件里,推荐使用dump(),但是如果不需要操作文件,或者需要把内容存储到数据库和excel,则需要使用dumps()先把字典转换成字符串,再写入。

    3.2.3 json.loads()  json -> python

    语法格式:

    1. json.loads(s,*,
    2. cls=None,
    3. object_hook=None,
    4. parse_float=None,
    5. parse_int=None,
    6. parse_constant=None,
    7. object_pairs_hook=None,
    8. **kw
    9. )

    使用示例1:json转换为python

    1. # 将json转换为python
    2. p_persopn = {"name":"jack",
    3. "age":18 ,
    4. "tel":["666888",'12312341234'],
    5. "isOnly":True
    6. }
    7. j_person = json.dumps(p_persopn)
    8. # json 转换为 python
    9. new_python = json.loads(j_person)
    10. print("json -> python:",new_python)
    11. print(type(new_python))

    显示结果:

    json -> python: {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}

    使用示例2:读取json文件并转换成python

    1. f = open("data.json",encoding='utf-8')
    2. content = f.read()
    3. python_obj = json.loads(content)
    4. print(python_obj)
    5. print(type(python_obj))

    显示结果:

    {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}

    3.2.4 json.load()  读取json文件并转换为python

    json.load()从json格式的文件中读取数据并转换为python的类型。

    语法格式:

    1. json.load(fp,*,
    2. cls=None,
    3. object_hook==None,
    4. parse_float==None,
    5. parse_int=None,
    6. parse_constant=None,
    7. object_hook=None,
    8. **kw
    9. )

    使用示例1:使用函数json.load()从文件中读取数据并转换为python的类型

    1. import json
    2. # 使用json.load()从json格式的文件中读取数据并转换为python的类型
    3. python_obj = json.load(open('data.json','r'))
    4. print('json.load(): ',python_obj)
    5. print(type(python_obj))

    显示结果:

    json.load():  {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}

    json.load()和json.loads()区别:

    • loads()参数是json字符串,load()参数是文件对象;
    • 使用loads()时需要先读取文件再使用,而load()则不用;

    3.3 解析JSON字串或文件

    分析:不管是JSON字串还是文件,都需要先把JSON格式的内容转换为python对象,然后逐层输出python对象(如果转换后的python对象是多层的话)。

    示例代码1:解析 json 字串

    1. import json
    2. json_str = '{"name":"test","type":{"name":"seq","parameter":["1","2"]}}'
    3. print(json_str)
    4. print(type(json_str))
    5. print("="*70)
    6. # 1. json文件转换为python对象
    7. p_obj = json.loads(json_str)
    8. print(p_obj)
    9. print(type(p_obj))
    10. print("="*70)
    11. # 2. 查询具体的数据节点
    12. print(p_obj.keys())
    13. print(p_obj.values())
    14. print("="*60)
    15. print("输出解析后的json文件")
    16. print("name : ",p_obj["name"])
    17. print("type : ",p_obj["type"])
    18. print("type-name : ",p_obj["type"]["name"])
    19. print("type-parameter : ",p_obj["type"]["parameter"])
    20. print("type-parameter[0]",p_obj["type"]["parameter"][0])
    21. print("type-parameter[1]",p_obj["type"]["parameter"][1])
    22. # 或者递归实现JSON文件解析,如下仅解析输出的字典类型
    23. def parase_dict(dct):
    24. '''
    25. 解析输出json转换后的python字典数据
    26. '''
    27. keys = dct.keys()
    28. vals = dct.values()
    29. for key in keys:
    30. if isinstance(dct[key],dict):
    31. print(key+" = ", dct[key])
    32. parase_dict(dct[key])
    33. else:
    34. print(key+" = ",dct[key])

    显示结果:

    dict_keys(['name', 'type'])
    dict_values(['test', {'name': 'seq', 'parameter': ['1', '2']}])
    ============================================================
    输出解析后的json文件
    name :  test
    type :  {'name': 'seq', 'parameter': ['1', '2']}
    type-name :  seq
    type-parameter :  ['1', '2']
    type-parameter[0] 1
    type-parameter[1] 2

    示例代码2:解析JSON文件

    1. import json
    2. def parase_dict(dct):
    3. '''
    4. 解析输出json转换后的python字典数据
    5. '''
    6. keys = dct.keys()
    7. vals = dct.values()
    8. for key in keys:
    9. if isinstance(dct[key],dict):
    10. print(key+" = ", dct[key])
    11. parase_dict(dct[key])
    12. else:
    13. print(key+" = ",dct[key])
    14. # 解析JSON文件
    15. print("="*60)
    16. p_obj = json.load(open("test.json","r"))
    17. print(p_obj)
    18. parase_dict(p_obj)

    显示结果:

    ============================================================
    {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}        
    name =  jack
    age =  18
    tel =  ['666888', '12312341234']
    isOnly =  True

  • 相关阅读:
    C++中使用递归函数
    网安学习-内网渗透4
    Linux学习第37天:Linux I2C 驱动实验:哥俩好
    [Angular 基础] - routing 路由(下)
    X11 Xlib截屏问题及深入分析三 —— 源码实现2
    gitlab自编译 源码下载
    Spring Cloud Gateway 集成Sa-Token
    华为云 异构数据迁移
    微信公众号之获取ticket
    Redis JDBC
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126133317