21天学习挑战赛——Python JSON标准库

目录

1. JSON概述

1.1 JSON概念

1.2 JSON格式

1.3 JSON注意事项

2. JSON模块 

2.1 JSON作用

2.2 Python<—>JSON 数据类型转换

2.2.1 Python——>JSON

2.2.2 JSON——>Python

2.3 json模块常用方法

​2.3.1 json.dumps()

2.3.2 json.dump()

2.3.3 json.dumps 和 json.dump 写入文件的区别

 2.3.4 json.loads()

2.3.5 json.load()

2.3.6 json.laods() 和 json.load() 区别

 2.4总结

3.XML文件和JSON文件相互转换

3.1 安装 xmltodict 模块

 3.2XML文件转为JSON文件

3.3 JSON文件转换为XML文件

4.解析JSON文件 

4.1解析JSON字符串

 4.2解析JSON文件


⭐每天的进步,都在悄悄进行,总会有所收获,YQQ对不起,情人节在外地出差不能陪你。我会变得越来越好,越能配得上你。加油!🌈

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

1. JSON概述

1.1 JSON概念

        JSON(全名:JavaScript Object Notation 对象表示法) 是一种轻量级文本数据交换格式,JSON的数据格式其实就是 Python 里面的字典格式,里面可以包含方括号的数组,也就是 Python 里面的列表。

1.2 JSON格式

语法格式:{key1:value, key2:value2} 键值对形式(键和值之间用冒号分开),键值对间用逗号连接,最好一个键值对后不再加逗号

用法举例:

#简单举例:JSON对象
{
    "name":Laowang,
    'age':35
}
#复杂举例:JSON数组
{
    "student":
        [
            {"name":"小明","score":99},
            {"name":"小红","score":60}
        ],
    "classroom":{"class1":"room1","class2":"room2"}
}

1.3 JSON注意事项

  1. JSON 的键值对的键部分,必须用双引号 "" 包括,单引号不行(所以如果在键中出现了关键字,也会被字符化),而 JS(JavaScript) 中对象没有强制要求(所以在键中不允许出现关键字)。
  2. JSON 的键值对的值部分,不允许出现函数function,undefined,NaN,但是可以有null。JS 中对象的值中 可以出现。
  3. JSON 数据库结束后,不允许出现没有意义的逗号,如:{"name":"Laowang", "age":35, },注意看数据结尾35后面的逗号,不允许出现。

2. JSON模块 

2.1 JSON作用

  1. 使用 JSON字符串 生成 Python 对象(load)。
  2. 由 Python 对象格式化乘 JSON字符串(dump)。

2.2 Python<—>JSON 数据类型转换

2.2.1 Python——>JSON

        将数据从 Python 转换到 JSON 格式,在数据类型上会有所变化,具体如下表所示:

Python ——> JSON
PythonJSON
dict(字典)object
list(列表),tuple(元组)array
strstring
int,float,int-& float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

2.2.2 JSON——>Python

        将 JSON格式 转化为 Python内置类型,具体如下表所示:

JSON ——> Python
JSONPython
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone

2.3 json模块常用方法

JSON 常用方法
方法功能
json.dumps(obj)将 Python 数据类型转换为 JSON格式 的字符串
json.dump(obj, fp)将 Python 数据类型转换并表春倒 JSON格式 的文件内
json.loads(s)将 JSON格式 的字符串转换为 Python 的数据类型
json.load(fp)从 JSON格式 的文件中读取数据并转换为 Python 的数据类型

​2.3.1 json.dumps()

        将 Python 数据类型转换为 JSON格式 的字符串。

函数语法:json.dumps(obj,*,skipkey=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=false,**kw)

参数说明:

  • obj:匹配的正则表达式
  • *:星号本身不是参数,星号后面的参数都是关键字参数,需要使用关键字传值,否则程序会报错。
  • skipkeys:默认为False。如果为True,则不是基本对象(包括str、int、float、bool、None)的字典的键会被跳过,否则会引发一个TypeError错误信息。
  • ensure_ascii:默认为 True,将所有输入的非 ASCII 字符转义输出;如果值为 False,会将输入的非 ASCII 字符原样输出。
  • check_circular:表示检验循环引用,默认值为True。如果值为False,则容器类型的循环引用会被跳过并引发一个 OverflowError 错误。
  • allow_nan:默认为True。如果值为False,那么会对 JSON 规范以外的 float 类型值(nan、inf 和 -inf)进行序列化时将会引发一个 ValueError 错误;如果值为,则使用它们的 JavaScript 等价形式(NaN、infinity 和 -infinity)。
  • cls:默认为None。通过该关键字,可以指定自定义 的 JSONEncoder 的子类。
  • indent:默认为 None。选择最紧凑的表达式。如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级;如果缩进等级为零、负数或者“”,则只会添加换行符。当 indent 为一个正整数时,会让每一层缩进同样数量的空格;如果 indent 是一个字符串,如换行符(\n)、制表符(\t)等,那么这个字符串会被用于每一层。
  • separators:默认为None。该参数是一个元组,定义分隔符的类型,其中包含空白字符。如果想得到最近凑的 JSON 表达式,应指定该参数为 (',',':'),不要空白字符。
  • default:默认为None。如果要指定该参数,则该参数应是一个函数。当某个对象无法被序列化时,它会被调用。返回该对象的一个被 JSON 编码的版本或者引发一个 TypeError(传入参数的类型错误)。如果不指定该参数,则会直接引发 TypeError。
  • sort_keys:默认为False。如果值为True,那么输出的字典会以键进行排序
  • **kw:其他关键字参数,用于字典。

 用法举例:

不带关键字参数举例:

import  json #导入json模块

#Python字典
person = {"name":"老王", "age":35, "tel":["88888888","17866666666"], "single":True}
print(person) #输出:{'name': '老王', 'age': 35, 'tel': ['88888888', '17866666666'], 'single': True}
print(type(person)) #输出:<class 'dict'>
#Python字典转换成JSON格式
josnStr = json.dumps(person)
print(josnStr) #输出:{"name": "\u8001\u738b", "age": 35, "tel": ["88888888", "17866666666"], "single": true}
print(type(josnStr)) #输出:<class 'str'>

分析:从上面代码可以看出 JSON 和 Python 格式的区别在于:Python 格式打印输出的是单引号,并且类型是字典(dic);而 JSON 格式打印输出的是双信号,类型为 字符串(str),并且 True 的开头大小写也有区别

带关键字参数举例:

import  json #导入json模块

person = {"name":"老王", "age":35, "tel":["88888888","17866666666"], "single":True}
print(json.dumps(person, sort_keys=True, indent=4, separators=(',',': ')))
#输出:
# {
#     "age": 35,
#     "name": "\u8001\u738b",
#     "single": true,
#     "tel": [
#         "88888888",
#         "17866666666"
#     ]
# }
print(json.dumps(person, sort_keys=True, indent=4, separators=('!','-'))) #改变分隔符类型
#输出:
# {
#     "age"-35!
#     "name"-"\u8001\u738b"!
#     "single"-true!
#     "tel"-[
#         "88888888"!
#         "17866666666"
#     ]
# }

分析:以上程序中,加入了三个关键字参数,分别是按键进行排序、缩进4个字符、键与值和键值对间的分隔符。

对文件操作举例:

import  json #导入json模块

person = {"name":"老王", "age":35, "tel":["88888888","17866666666"], "single":True}
jsonStr = json.dumps(person)
with open('test.json','w',encoding='utf-8') as f:
    f.write(jsonStr)
#文件test.json中内容:{"name": "\u8001\u738b", "age": 35, "tel": ["88888888", "17866666666"], "single": true}

分析:上段程序将字典形式转换为 JSON 格式,并且生成一个名字为“test.json”的文件,将 JSON格式 数据存入文件中,一般生成的文件所在路径和程序所在路径相同。

2.3.2 json.dump()

        json.dump() 是将 Python 数据类型转换并保存到 JSON 格式的文件内。

函数语法:json.dump(obj,fp,*,skipkey=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,default=None,sort_keys=false,**kw)

参数说明:(相比于 dumps,只多了一个必选参数 fp,其他参数类似)

  • fps :JSON 格式的文件流

用法举例:

非格式化输出举例:

import  json #导入json模块

person = {"name":"老王", "age":35, "tel":["88888888","17866666666"], "single":True}
json.dump(person, open('data.json','w'))
#生成的data.json文件中内容:{"name": "\u8001\u738b", "age": 35, "tel": ["88888888", "17866666666"], "single": true}

分析:由于上面代码中,未用到关键字参数,生成的文件中,并不会格式化输出。

格式化输出举例:

import  json #导入json模块

person = {"name":"老王","age":35,"tel":["88888888","17866666666"],"single":True}
json.dump(person, open('data.json','w'), sort_keys=True, indent=4, separators=(',',': '))
#生成的data.json文件中内容:
# {
#     "age": 35,
#     "name": "\u8001\u738b",
#     "single": true,
#     "tel": [
#         "88888888",
#         "17866666666"
#     ]
# }

分析:上面代码使用到了 JSON 的格式化输出参数。在输出时,即使把原字典格式写得和规范格式相同,输出时如果不添加格式化使出关键字参数,还是会一行输出。

2.3.3 json.dumps 和 json.dump 写入文件的区别

  1. dump() 不需要使用 .write() 方法,只需要写入的字典,文件流即可;而 dumps() 需要使用 .write() 方法写入。
  2. 如果需要把字典写到文件里,dump() 好用;而如果不需要操作文件,或者需要把内容存储到数据库 excel 中,则需要使用 dumps() 先把字典转换成字符串,再写入。

 2.3.4 json.loads()

        将 JSON 格式的字符串转换成 Python的数据类型。

函数语法:json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数说明:

  • s:字符串
  • cls:用于自定义一个子类 JSONCoder,用于替换 JSONCoder类,可以自定义下面的 parse_xxx 参数。
  • object_hook:将返回结果字典替换为指定类型,该参数用来实现自定义解码器。
  • parse_float:该参数被指定时,符合 flaot 类型的字符串被转义成指定类型。
  • parse_int:该参数被指定时,符合 int 类型的字符串被转义成指定类型。
  • parse_constant:该参数被指定时,解码 JSON 字符串时,如果出现 -Infinity,Infinity,NaN 会调用从该参数指定方法。
  • object_pairs_hook:该参数被制定是,将结果以 key-value 列表的形式返回。如果 object_hook 和 object_pairs_hook 同时指定时,优先返回 object_pairs_hook。

普通操作用法举例: 

import  json #导入json模块

#Python字典
person = {"name":"老王", "age":35, "tel":["88888888","17866666666"], "single":True}
print(person) #输出:{'name': '老王', 'age': 35, 'tel': ['88888888', '17866666666'], 'single': True}
print(type(person)) #输出:<class 'dict'>
#Python字典转换成JSON格式
josnStr = json.dumps(person)
print(josnStr) #输出:{"name": "\u8001\u738b", "age": 35, "tel": ["88888888", "17866666666"], "single": true}
print(type(josnStr)) #输出:<class 'str'>

#JSON字符串再次转换为Python字典
Python_obj = json.loads(josnStr)
print(Python_obj) #输出:{'name': '老王', 'age': 35, 'tel': ['88888888', '17866666666'], 'single': True}
print(type(Python_obj)) #输出:<class 'dict'>
#打印字典所有的键key
print(Python_obj.keys()) #输出:dict_keys(['name', 'age', 'tel', 'single'])
#打印字典所有的值value
print(Python_obj.values()) #输出:dict_values(['老王', 35, ['88888888', '17866666666'], True])

 分析:使用 json.loads() 方法将 JSON 格式的字符串传换成 Python 字典格式后,可正常使用关于字典的操作。

文件操作用法举例:

import  json #导入json模块

f = open('data.json',encoding='utf-8')
content =f.read()  #使用 json.loads() 方法前需要先读取文件
Python_obj = json.loads(content)
print(Python_obj) #输出:{'age': 35, 'name': '老王', 'single': True, 'tel': ['88888888', '17866666666']}

2.3.5 json.load()

        从 JSON 格式的文件中读取数据并转换为 Python 的数据类型。

函数语法:json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数说明:(其余参数和 json.loads() 方法类似,不再介绍)

  • fp:文件的数据流

 用法举例:

import  json #导入json模块

Python_obj = json.load(open('data.json','r'))
print(Python_obj) #输出:{'age': 35, 'name': '老王', 'single': True, 'tel': ['88888888', '17866666666']}
print(type(Python_obj)) #输出:<class 'dict'>

2.3.6 json.laods() 和 json.load() 区别

  1. load() 传入的参数是 JSON 字符串,而 load() 传入的是文件对象。
  2. 使用 loads() 方法时需要先读取文件再使用,而 load() 不用。

 2.4总结

        不管是 dump 还是 load,后面带 s 的都是和字符串相关的, 不带 s 的都是和文件相关的。

3.XML文件和JSON文件相互转换

3.1 安装 xmltodict 模块

 使用 Pycharm 安装模块请参考:Pycharm安装第三方模块 

cmd 命令控制窗口安装第三方模块:

pip install xmltodict

 3.2XML文件转为JSON文件

新建一个 test.xml 文件,里面包含以下代码:

<note date="23/04/2022">
	<to>tom</to>
	<from>mary</from>
	<msg>love</msg>
</note>

用法举例:

import  json #导入json模块
import xmltodict #导入xmltodict模块

def xml_to_json(xml_str):
    """ parse 方法是xml的解析器,参数是xml里的数据
    :param xml_str: xml字符串
    :return: json字符串
    """
    xml_parse = xmltodict.parse(xml_str)
    #json库dumps()是将dict转化成json格式,loads()是将json格式转化成dict格式
    #dumps()方法的ident=1,格式化json
    json_str = json.dumps(xml_parse, indent=1)
    return json_str

XML_PATH = './test.xml'
with open(XML_PATH,'r') as f:
    xmlfile = f.read()
    with open(XML_PATH[:-3]+'json','w') as newfile:
        newfile.write(xml_to_json(xmlfile))

 分析:上面程序中函数创建了一个函数 xml_to_json 用以将 XML 格式文件转换成 JSON 格式文件。先用 parse 方法解析 xml 文件,返回的是 collections.OrderedDict 类型的参数,类似于 Python 字典格式,再用 dumps 方法格式化为 JSON 格式。最终结果如下,创建了一个 test.json 文件。

3.3 JSON文件转换为XML文件

在程序相同目录新建一个 test.json文件,里面包含以下代码:

{
  "student": {
    "course": {
      "name": "math",
      "score": "90"
    },
    "info": {
      "sex": "male",
      "name": "Xiaolang"
    },
    "stid": "36969"
  }
}

用法举例:

import  json #导入json模块
import xmltodict #导入xmltodict模块

def json_to_xml(Python_dict):
    """ unparse() 方法将json格式转化为xml
    :param Python_dict:Python的字典对象
    :return: xml字符串
    """
    xml_str = xmltodict.unparse(Python_dict)
    return xml_str

JSON_PATH = './test.json'
with open(JSON_PATH,'r') as f:
    jsonfile = f.read()
    Python_dict = json.loads(jsonfile)
    with open(JSON_PATH[:-4]+'xml','w') as newfile:
        newfile.write(json_to_xml(Python_dict))

分析:上面程序中函数创建了一个函数 json_to_xml 用以将 JSON 格式文件转换成 XML 格式文件。先用 unparse 方法解析 JSON文件,返回的是 str 类型的数据。最终结果如下,创建了一个 test.xml 文件。

4.解析JSON文件 

4.1解析JSON字符串

        解析 JSON 文件其实就是定位到所需数据的键。

用法举例:

import  json #导入json模块

json_str = '{"name":"XiaoLang","info":{"sex":"male","score":["99","98"]}}'
print(json_str) #输出:{"name":"XiaoLang","info":{"sex":"male","score":["99","98"]}}
print(type(json_str)) #输出:<class 'str'>

#1.JSON文件转换为Python对象
Python_obj = json.loads(json_str)
print(Python_obj) #输出:{'name': 'XiaoLang', 'info': {'sex': 'male', 'score': ['99', '98']}}
print(type(Python_obj)) #输出:<class 'dict'>

#2.具体定位数据节点
print(Python_obj.keys()) #输出:dict_keys(['name', 'info'])
print(Python_obj.values()) #输出:dict_values(['XiaoLang', {'sex': 'male', 'score': ['99', '98']}])
print(Python_obj["name"]) #输出:XiaoLang
print(Python_obj["info"]["sex"]) #输出:male
print(Python_obj["info"]["score"][0]) #输出:99
print(Python_obj["info"]["score"][1]) #输出:98

分析: 将 JSON 字符串转换成 Python 的字典数据后,就可运用字典类型的数据对应方法去取值。

 4.2解析JSON文件

在程序相同目录新建一个 test.json文件,里面包含以下代码:

{
  "student": {
    "course": {
      "name": "math",
      "score": "90"
    },
    "info": {
      "sex": "male",
      "name": "Xiaolang"
    },
    "stid": "36969"
  }
}

 用法举例:

import  json #导入json模块

#1.JSON文件转换为Python对象
Python_obj = json.load(open('test.json','r'))
print(Python_obj) #输出:{'student': {'course': {'name': 'math', 'score': '90'}, 'info': {'sex': 'male', 'name': 'Xiaolang'}, 'stid': '36969'}}
print(type(Python_obj)) #输出:<class 'dict'>

#2.解析JSON文件
#2.1输出course节点下的数据
print(Python_obj['student']['course']['name']) #输出:math
print(Python_obj['student']['course']['score']) #输出:90
#2.2输出info节点下的数据
print(Python_obj['student']['info']['sex']) #输出:male
print(Python_obj['student']['info']['name']) #输出:Xiaolang

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落指尖❀

您的认可是小浪宝宝最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值