活动地址:CSDN21天学习挑战赛
目录
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
**
**
JSON,Java Script Object Notation,是一种轻量级的文本数据交换格式,JSON独立于语言,具有自我描述性,更易理解;JSON比XML更小、更快、更易解析;爬虫经常获取的接口数据就是JSON格式。
JSON数据格式类似python的字典格式,里面包括方括号括起来的数组,类似python里的列表。
语法格式:{key1:value1, key2:value2},如果value表示的数据有很多,用方括号括起来[],称为数组。
JSON是键值对形式构成的,键的部分必须用双引号包裹 "",值的部分,不允许出现函数function,undefined,NaN,但可以有null,不允许出现没有意义的逗号。
如下:
格式1:JSON 对象
- {
- "name" : "Jack",
- "age" : 18
- }
格式2:JSON数组
- {
- "student":
- [
- {"name" : "Jack", "age" : 18},
- {"name" : "Lucy", "age" : 18}
- ],
- "classroom" : {
- "class1" : "room1",
- "class2" : "room2"
- }
- }
python提供了json模块,作用是使用JSON字符串生成python对象(load),或由python对象格式化成json字符串(dump)。
使用时需要导入模块:import json
python -> json时,数据类型会有变化,如下:
Python | JSON |
dict | object |
list,tuple | array |
str | string |
int,float,int-&,float-derived Enums | number |
True | true |
False | false |
None | null |
json -> python,转换时数据类型变化如下:
JSON | Python |
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
方法 | 功能 |
json.dumps(obj) | 将python数据类型转换为json格式的字符串 |
json.dump(obj,fp) | 将python数据类型转换并保存到json格式的文件内 |
json.loads(s) | 将json格式的字符串转换为python的类型 |
json.load(fp) | 从json格式的文件中读取数据并转换为python的类型 |
json.dumps()函数将python数据类型转换为json格式的字符串。
- json.dumps(obj,*,
- skipkeys=False, # 是否允许JSON字串编码字典对象时,字典的key不是字符串类型(默认不允许)
- ensure_ascii=True,
- check_circular=True,
- allow_nan=True,
- cls=None,
- indent=None, # 定义缩进
- separators=None, # 是一个元组,定义分隔符的类型
- default=None,
- sort_keys=False, # 是否排序
- **kw)
使用示例1:将python字典转换为json字符串
- import json
-
- # python 字典
- p_persopn = {"name":"jack",
- "age":18 ,
- "tel":["666888",'12312341234'],
- "isOnly":True
- }
- print("python: ",p_persopn)
-
- # 转换为json字符串
- j_person = json.dumps(p_persopn)
- 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字串:
- import json
-
- # python 字典
- p_persopn = {"name":"jack",
- "age":18 ,
- "tel":["666888",'12312341234'],
- "isOnly":True
- }
- print("python: ",p_persopn)
-
- # 格式化输出json字串
- j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
- print("格式化输出JSON:",j_person)
-
- j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=('!','='))
- 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字串后存入文件
- import json
-
- # 保存json文件
- p_persopn = {"name":"jack",
- "age":18 ,
- "tel":["666888",'12312341234'],
- "isOnly":True
- }
- print("python: ",p_persopn)
-
- j_person = json.dumps(p_persopn)
- with open('test.json','w',encoding='utf-8') as f: # 打开文件
- f.write(j_person) # 写入文件
- print("保存json文件完成!")
-
- j_person = json.dumps(p_persopn,sort_keys=True,indent=4,separators=(',',':'))
- with open('test_format.json','w',encoding='utf-8') as f: # 打开文件
- f.write(j_person) # 写入文件
- print("保存json文件完成!")
显示结果,新生成的文件:
json.dump()函数:
- json.dump(obj,fp,*,
- skipkeys=False,
- ensure_ascii=True,
- check_circular=True,
- allow_nan=True,
- cls=None,
- indent=None,
- separators=None,
- default=None,
- sort_keys=False,
- **kw
- )
使用示例1:python格式转换为json格式并保存到文件中
- import json
-
- # python -> json 并保存文件
- p_persopn = {"name":"jack",
- "age":18 ,
- "tel":["666888",'12312341234'],
- "isOnly":True
- }
- json.dump(p_persopn,open("data.json","w"))
- # 格式化保存python转换的json
- json.dump(p_persopn,open("data_format.json","w"),sort_keys=True,indent=4,separators=(',',':'))
生成的文件显示:
json.dumps()和json.dump()比较:
语法格式:
- json.loads(s,*,
- cls=None,
- object_hook=None,
- parse_float=None,
- parse_int=None,
- parse_constant=None,
- object_pairs_hook=None,
- **kw
- )
使用示例1:json转换为python
- # 将json转换为python
- p_persopn = {"name":"jack",
- "age":18 ,
- "tel":["666888",'12312341234'],
- "isOnly":True
- }
- j_person = json.dumps(p_persopn)
- # json 转换为 python
- new_python = json.loads(j_person)
- print("json -> python:",new_python)
- print(type(new_python))
显示结果:
json -> python: {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
使用示例2:读取json文件并转换成python
- f = open("data.json",encoding='utf-8')
- content = f.read()
- python_obj = json.loads(content)
- print(python_obj)
- print(type(python_obj))
显示结果:
{'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
json.load()从json格式的文件中读取数据并转换为python的类型。
语法格式:
- json.load(fp,*,
- cls=None,
- object_hook==None,
- parse_float==None,
- parse_int=None,
- parse_constant=None,
- object_hook=None,
- **kw
- )
使用示例1:使用函数json.load()从文件中读取数据并转换为python的类型
- import json
- # 使用json.load()从json格式的文件中读取数据并转换为python的类型
- python_obj = json.load(open('data.json','r'))
- print('json.load(): ',python_obj)
- print(type(python_obj))
显示结果:
json.load(): {'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
json.load()和json.loads()区别:
分析:不管是JSON字串还是文件,都需要先把JSON格式的内容转换为python对象,然后逐层输出python对象(如果转换后的python对象是多层的话)。
示例代码1:解析 json 字串
- import json
-
-
- json_str = '{"name":"test","type":{"name":"seq","parameter":["1","2"]}}'
- print(json_str)
- print(type(json_str))
- print("="*70)
-
- # 1. json文件转换为python对象
- p_obj = json.loads(json_str)
- print(p_obj)
- print(type(p_obj))
- print("="*70)
-
- # 2. 查询具体的数据节点
- print(p_obj.keys())
- print(p_obj.values())
- print("="*60)
- print("输出解析后的json文件")
- print("name : ",p_obj["name"])
- print("type : ",p_obj["type"])
- print("type-name : ",p_obj["type"]["name"])
- print("type-parameter : ",p_obj["type"]["parameter"])
- print("type-parameter[0]",p_obj["type"]["parameter"][0])
- print("type-parameter[1]",p_obj["type"]["parameter"][1])
-
- # 或者递归实现JSON文件解析,如下仅解析输出的字典类型
- def parase_dict(dct):
- '''
- 解析输出json转换后的python字典数据
- '''
- keys = dct.keys()
- vals = dct.values()
-
- for key in keys:
- if isinstance(dct[key],dict):
- print(key+" = ", dct[key])
- parase_dict(dct[key])
-
- else:
- 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文件
- import json
-
-
- def parase_dict(dct):
- '''
- 解析输出json转换后的python字典数据
- '''
- keys = dct.keys()
- vals = dct.values()
-
- for key in keys:
- if isinstance(dct[key],dict):
- print(key+" = ", dct[key])
- parase_dict(dct[key])
-
- else:
- print(key+" = ",dct[key])
-
-
- # 解析JSON文件
- print("="*60)
- p_obj = json.load(open("test.json","r"))
- print(p_obj)
- parase_dict(p_obj)
显示结果:
============================================================
{'name': 'jack', 'age': 18, 'tel': ['666888', '12312341234'], 'isOnly': True}
name = jack
age = 18
tel = ['666888', '12312341234']
isOnly = True