"""
json.load() json.loads() json.dump() json.dumps() 的区别
以及 json.jsonpath 用法
"""
import json
import jsonpath
# json.dumps() 将python中字典类型转化成json字符串类型
python_dict = {
'contact_name': 'Auto-test111',
'contact_phone': '18621300857',
'province_code': '110000',
'city_code': '110100',
'district_code': '110101',
'address': '北京市东城区',
'builtin_is_default_address': False,
'managed': 1
}
json_dumps_str = json.dumps(python_dict, ensure_ascii=False)
print(json_dumps_str, type(json_dumps_str)) # {"contact_name": "Auto-test111", "contact_phone": "18621300857", "province_code": "110000", "city_code": "110100", "district_code": "110101", "address": "北京市东城区", "builtin_is_default_address": false, "managed": 1} <class 'str'>
# json.loads() 将json字符串类型转化成python中字典类型
json_str = '{"contact_name": "Auto-test111", "contact_phone": "18621300857", "province_code": "110000",' \
' "city_code": "110100", "district_code": "110101", "address": "北京市东城区",' \
' "builtin_is_default_address": false, "managed": 1}'
json_dict = json.loads(json_str)
print(json_dict, type(json_dict)) # {'contact_name': 'Auto-test111', 'contact_phone': '18621300857', 'province_code': '110000', 'city_code': '110100', 'district_code': '110101', 'address': '北京市东城区', 'builtin_is_default_address': False, 'managed': 1} <class 'dict'>
# json.load 将json文件转化成python 字典类型
with open('address.json', encoding='utf-8') as load_json_file:
payload = json.load(load_json_file)
print(payload, type(payload)) # {'contact_name': 'Auto-test111', 'contact_phone': '18621300857', 'province_code': '110000', 'city_code': '110100', 'district_code': '110101', 'address': '北京市东城区', 'builtin_is_default_address': False, 'managed': 1} <class 'dict'>
# json.dumps 将python 字典类型写入json文件
with open("address_new.json", 'w', encoding='utf-8') as write_json_file:
json.dump(python_dict, write_json_file, ensure_ascii=False)
# jsonpath 的用法
dict_value = {"meta": {"code": 2000, "dataset": {"data": [{"name": "jack_1", "age": 24, "gender": "男"},
{"name": "jack_2", "age": 25, "gender": "男"},
{"name": "jack_3", "age": 26, "gender": "女"},
{"name": "jack_4", "age": 27, "gender": "女"},
{"name": "jack_5", "age": 28, "gender": "女"},
{"name": "jack_6", "age": 29, "gender": "男"}]}}}
# 获取所有学生的名字
student_names = jsonpath.jsonpath(dict_value, '$.meta.dataset.data[*].name')
student_names = jsonpath.jsonpath(dict_value, '$.meta.dataset..name')
print(student_names) # ['jack_1', 'jack_2', 'jack_3', 'jack_4', 'jack_5', 'jack_6']
# 获取第一个学生的名字
student_name = jsonpath.jsonpath(dict_value, '$.meta.dataset.data[0].name')
print(student_name) # ['jack_1']
# 获取学生年龄是28岁的学生信息
student_info = jsonpath.jsonpath(dict_value, '$.meta.dataset.data.[?(@.age == 28)]')
print(student_info) # [{'name': 'jack_5', 'age': 28, 'gender': '女'}]
# 获取学生性别是男性的学生信息
student_info = jsonpath.jsonpath(dict_value, '$.meta.dataset.data.[?(@.gender == "男")]')
print(student_info) # [{'name': 'jack_1', 'age': 24, 'gender': '男'}, {'name': 'jack_2', 'age': 25, 'gender': '男'}, {'name': 'jack_6', 'age': 29, 'gender': '男'}]
# 获取学生性别是男性的学生名字
student_names = jsonpath.jsonpath(dict_value, '$.meta.dataset.data.[?(@.gender == "男")].name')
print(student_names) # ['jack_1', 'jack_2', 'jack_6']