Python 从文件中读取JSON 数据并解析转存
温馨提示:这篇文章已超过386天没有更新,请注意相关的内容是否还可用!
文章目录
- 文章开篇
- Json简介
- Json数据类型
- Json硬性规则
- Json数据转化网站
- Json和Dict类型转换
- json模块的使用
- Python数据和Json数据的类型映射
- json.dumps
- 1.字典数据中含有**存在中文**
- 2.json数据通过缩进符**美观输出**
- 3.对Python数据类型中键进行**排序输出**
- 4.json数据**分隔符的控制**
- json.dump
- json.loads
- json.load
- Json和非Dict类型数据转换
- 1.元祖转换
- 2.列表转换
- 3.布尔值转换
- 4.数值转换
- 案例应用
- 1.JSON数据的合并与去重
- 2.JSON数据的动态查询与过滤
- 总结
文章开篇
Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!
Json简介
JSON(JavaScript Object Notation)数据是一种轻量级的数据交换格式;
JSON数据使用键值对的方式来组织数据,其中键是字符串,值是字符串、数字、布尔值、数组、对象或null;
由于JSON数据格式简单且易于解析,它已成为现代应用程序中常用的数据格式之一,特别是在Web应用程序和移动应用程序中进行数据交换时,JSON数据被广泛使用。
Json数据类型
在JSON(JavaScript Object Notation)语言中,存在六种基本数据类型;
- 字符串(String):由零个或多个字符组成的有序字符序列,用于表示文本信息;
- 数字(Number):可以是整数或浮点数,用于表示数值信息;
- 布尔值(Boolean):只有两个取值,true 或 false,用于表示逻辑状态;
- 数组(Array):有序的值的集合,每个值可以是一个数据类型或另一个数组,用于表示列表或集合;
- 对象(Object):无序的键值对集合,其中每个键都是一个字符串,每个值可以是任意数据类型,用于表示复杂的数据结构;
- null:表示空值或不存在的值;
这些数据类型可以单独使用,也可以组合起来创建更复杂的数据结构;
例如,一个对象可以包含多个键值对,其中值可以是字符串、数字、布尔值、数组或另一个对象;
同样,数组可以包含任意数量的元素,每个元素都可以是任意数据类型;
这种灵活性和组合性使得JSON成为一种强大且通用的数据交换格式;
Json硬性规则
- 在JSON语言中,字符集的使用被严格限定为UTF-8。这是因为UTF-8编码能够支持全球范围内的字符集,确保了JSON数据的跨语言、跨平台兼容性;
- 为了确保JSON数据的解析一致性和准确性,JSON标准规定字符串的界定符必须是双引号(“”)。这意味着在JSON中,所有的字符串都必须用双引号括起来,而不能使用单引号或其他字符;
Json数据转化网站
- **json.cn:**https://www.json.cn/
- **kjson:**https://www.kjson.com/
- **json菜鸟工具:**https://c.runoob.com/front-end/53
- **sojson:**https://www.sojson.com/ 非常全的json处理网站
- **编程狮-json检验工具:**https://www.w3cschool.cn/tools/index?name=jsoncheck
- **JSONViewer:**http://jsonviewer.stack.hu/ 用于检测Json格式是否正确的一个在线应用工具
Json和Dict类型转换
处理JSON文件时,由于文件内容被视为单一字符串,不能直接使用其内部数据;
想要访问其键值对,需将其转换为Python字典,这样就可以程序中读取和修改;
- Json数据是以字符串表示,Json转Dict叫反序列化;
- Dict是内存中的实际数据结构对象,Dict转Json叫序列化;
Python的内置json模块是转换JSON与Python字典的便捷工具,提供高效方法处理JSON数据;
深入学习该模块可参考官方文档:https://docs.python.org/3/library/json.html。
json模块的使用
json模块是Python的内置模块,无需额外下载安装,使用时直接导入即可
import json
json模块中存在四种方法用来进行Python内置数据类型的转换:
方法 说明 Json.dumps() 将python对象编码成json字符串(dict转json) json.loads() 将json字符串解码成python对象(json转dict) json.dump() 将python中的对象转化成json存储到文件 json.load() 将文件中的json格式转换成python对象提取出来 Python数据和Json数据的类型映射
dumps和dump函数的作用是将Python数据类型转成json类型数据;
转化对照表如下
Python数据类型 Json数据类型 dict object list、tuple array str,unicode string int、float number True true False false None null loads和load函数的作用是将json类型数据转换成Python数据类型;
转化对照表如下
Json数据类型 Python数据类型 object dict array list string str number int、float true True false False null None json.dumps
作用:将Python字典类型的数据转成json格式的数据
json.dumps(...)参数释义如下
import json json.dumps( obj, # 待转化的对象 skipkeys=False, # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key ensure_ascii=True, # 默认是ASCII码,若设置成False,则可以输出中文 check_circular=True,# 若为False,跳过对容器类型的循环引用检查 allow_nan=True, # 若allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity) cls=None, indent=None, # 参数根据格式缩进显示,表示缩进几个空格 separators=None, # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: ` encoding="utf-8", # 编码 default=None, # 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误 sort_keys=False, # 若为False,则字典的键不排序;设置成True,按照字典排序(a到z) **kw)通过示例来解释上面几个常见参数的作用
1.字典数据中含有存在中文
import json dict_data = { "name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086" } # 字典转成json数据 json_data = json.dumps(dict_data) print(type(dict_data), dict_data) # {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'} print(type(json_data), json_data) # {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"} # 加上ensure_ascii=False参数即可将中文解码 json_data = json.dumps(dict_data, ensure_ascii=False) print(type(json_data), json_data) # {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"}2.json数据通过缩进符美观输出
import json dict_data = { "name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086" } # 字典转成json数据 json_data = json.dumps(dict_data) print(type(dict_data), dict_data) # {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'} print(type(json_data), json_data) # {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"} # 对json数据通过缩进符美观输出,使用indent参数 json_data = json.dumps(dict_data, ensure_ascii=False, indent=4) print(type(json_data), json_data) # { # "name": "张三", # "age": 18, # "sex": "男", # "address": "上海", # "phone": "10086" # }3.对Python数据类型中键进行排序输出
import json dict_data = { "name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086" } # 字典转成json数据 json_data = json.dumps(dict_data) print(type(dict_data), dict_data) # {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'} print(type(json_data), json_data) # {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"} # 对Python数据类型中键进行排序输出 json_data = json.dumps(dict_data, ensure_ascii=False, indent=4, sort_keys=True) print(type(json_data), json_data) # { # "address": "上海", # "age": 18, # "name": "张三", # "phone": "10086", # "sex": "男" # }4.json数据分隔符的控制
import json dict_data = { "name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086" } # 字典转成json数据 json_data = json.dumps(dict_data) print(type(dict_data), dict_data) # {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'} print(type(json_data), json_data) # {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"} # 对json数据通过缩进符美观输出,使用indent参数 json_data = json.dumps(dict_data, ensure_ascii=False) print(type(json_data), json_data) # {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"} json_data = json.dumps(dict_data, ensure_ascii=False, separators=(" + ", " @ ")) print(type(json_data), json_data) # {"name" @ "张三" + "age" @ 18 + "sex" @ "男" + "address" @ "上海" + "phone" @ "10086"}json.dump
- json.dump函数:将Json格式的数据写入文件中;
- json.dumps函数:将Python字典类型的数据转成json格式的数据;
import json dict_data = { "name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086" } # 使用json.dump;json数据一定是双引号 with open(file="test_json.json", mode="w", encoding="utf-8") as file: # 全部写入一行数据,不换行 json.dump(dict_data, # 待写入数据 file, # File对象 sort_keys=True, # 键的排序 ensure_ascii=False) # 显示中文 # test_json.json文件内容如下: # {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"} with open(file="test_json.json", mode="w", encoding="utf-8") as file: # 全部写入一行数据,不换行 json.dump(dict_data, # 待写入数据 file, # File对象 indent=4, # 设置缩进 sort_keys=True, # 键的排序 ensure_ascii=False) # 显示中文 # test_json.json文件内容如下: # { # "address": "上海", # "age": 18, # "name": "张三", # "phone": "10086", # "sex": "男" # }json.loads
作用:将json格式的数据转换成python字典类型的数据;
import json # json字符串在python中是以字符串形式保存的,只是它的内部是按照json的规则构建 json_data = '{"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}' print(type(json_data), json_data) # {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"} dict_data = json.loads(json_data) print(type(dict_data), dict_data) # {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}json.load
作用:打开json文件,将之读取后转换成字典形式的数据;
- json.load函数:打开json文件,将之转成字典形式的数据;
- json.loads函数:将json格式的数据转换成python字典类型的数据;
import json with open(file="test_json.json", mode="r", encoding="utf-8") as file: json_to_dict = json.load(file) # json转成字典 print(type(json_to_dict), json_to_dict) # {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}Json和非Dict类型数据转换
1.元祖转换
import json # 定义一个元祖类型的数据 tuple_data = (1, 2, 3, 4, 5) # 将元祖类型的数据转换成json格式 json_data = json.dumps(tuple_data) print(type(json_data), json_data) # [1, 2, 3, 4, 5]
2.列表转换
import json # 定义一个列表类型的数据 list_data = [1, 2, 3, 4, 5] # 将列表类型的数据转换成json格式 json_data = json.dumps(list_data) print(type(json_data), json_data) # [1, 2, 3, 4, 5]
3.布尔值转换
import json # 定义一个布尔类型的数据 bool_data = True # 将布尔类型的数据转换成json格式 json_data = json.dumps(bool_data) print(type(json_data), json_data) # true
4.数值转换
import json # 定义一个数值类型的数据 bool_data = 10086 # 将数值类型的数据转换成json格式 json_data = json.dumps(bool_data) print(type(json_data), json_data) # 10086
案例应用
1.JSON数据的合并与去重
假设有多个JSON文件,每个文件包含一组用户数据,并且希望将这些数据合并到一个文件中,同时去除重复的用户
import json # 定义一个函数来合并和去重JSON数据 def merge_and_deduplicate_json(file_list, output_file): users = [] seen_users = set() for file_path in file_list: with open(file_path, 'r') as file: data = json.load(file) for user in data: user_id = user.get('id') if user_id not in seen_users: users.append(user) seen_users.add(user_id) # 将合并后的数据写入输出文件 with open(output_file, 'w') as file: json.dump(users, file, indent=4) # 使用示例 merge_and_deduplicate_json(['users1.json', 'users2.json', 'users3.json'], 'merged_users.json')2.JSON数据的动态查询与过滤
如果有一个大型的JSON数据集,并且需要根据特定的条件来查询和过滤数据,可以使用Python的json模块结合其他数据处理功能
import json # 读取JSON文件 with open('large_dataset.json', 'r') as file: data = json.load(file) # 定义一个函数来查询和过滤数据 def query_and_filter_data(data, query_conditions): filtered_data = [] for item in data: if all(condition(item) for condition in query_conditions): filtered_data.append(item) return filtered_data # 定义查询条件 def is_age_over_25(item): return item['age'] > 25 def has_email(item): return 'email' in item and item['email'] # 查询和过滤数据 filtered_users = query_and_filter_data(data, [is_age_over_25, has_email]) # 输出结果 for user in filtered_users: print(user)总结
Python的json模块是一个非常方便的库,用于处理json格式的数据;
json数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据;
本文首先对json数据及格式进行了简介,重新认识json数据;
其次,结合各种实际案例,将json和Python的各种数据类型,尤其是字典类型进行了转化;
最后,重要讲解了json数据的读取、写入和规范化的操作。
- json序列化方法:
dumps:无文件操作
dump:序列化 + 写入文件
- json反序列化方法:
loads:无文件操作
load:读文件 + 反序列化
- 格式化写入文件使用indent参数 = 4
- 将中文解码使用ensure_ascii参数 = False
- json序列化方法:




