活动地址: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字串或文件
**
**
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