简介

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而在Python中处理JSON格式的模块有json和pickle两个。

json模块和pickle都提供了四个方法:dumps, dump, loads, load
序列化:将python的数据转换为json格式的字符串
反序列化:将json格式的字符串转换成python的数据类型

dumps与loads

dumps与loads主要是针对于json数据的处理,更加关注于数据类型本身。

json_data = {'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
content = json.dumps(json_data)
print(content)
print(type(content))
content = json.loads(content)
print(content)
print(type(content))
{"test": {"test1_1": 1}, "test2": {"test2_2": {"test2_3": 2}}, "test3": {"test3_2": {"test3_3": {"test3_4": 3}}}}
<class 'str'>
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
<class 'dict'>

dump与load

dump与load主要是针对于json文件的处理。

test.json

{
"test":{
"test1_1":1
},
"test2":{
"test2_2":{
"test2_3":2
}
},
"test3":{
"test3_2":{
"test3_3":{
"test3_4":3
}
}
}
}

读取json数据并写入新的json数据

import json, os

JSON_PATH = os.path.join(os.path.dirname(__file__), 'test.json')
JSON_PATH2 = os.path.join(os.path.dirname(__file__), 'test2.json') with open(JSON_PATH, mode='r', encoding='utf8') as r_f:
content = json.load(r_f)
print(content)
print(type(content))
with open(JSON_PATH2, mode='w', encoding='utf-8') as w_f:
json.dump(content, w_f, indent=True)
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
<class 'dict'>

总结

json.dumps、json.dump是将python数据类型转换为json数据的字符串类型。

json.loads、json.load是将json数据的字符串类型转换为python数据类型,一般为字典

json.dumps与json.loads主要是针对于json数据的处理,更加关注于数据类型本身。

json.dump与json.load主要是针对于json文件的处理。

补充

读取json文件中的所有key值(包含嵌套)

json文件如下:

{
"test":{
"test1_1":1
},
"test2":{
"test2_2":{
"test2_3":2
}
},
"test3":{
"test3_2":{
"test3_3":{
"test3_4":3
}
}
},
"test4":{
"test4_2":{
"test4_3":{
"test4_4": {
"test4_5": 4
}
}
}
},
"test5":5
}
import time

data_list = []

# 读取json数据中所有的key
def read_json_key(json_path):
with open(json_path, mode='r', encoding='utf-8') as f:
content = json.load(f)
print(content)
start = time.time()
get_json_key(content)
print(time.time() - start)
print(f'data_list:{data_list}')
start = time.time()
print('get_json_key2:',list(get_json_key2(content)))
print(time.time() - start)
start = time.time()
print('get_json_key3:',list(get_json_key3(content)))
print(time.time() - start) def get_json_key(content):
if isinstance(content, dict) and len(content) > 0:
for key in content.keys():
data_list.append(key)
get_json_key(content[key]) def get_json_key2(content):
if isinstance(content, dict) and len(content) > 0:
for key in content.keys():
yield key
for item in get_json_key2(content[key]):
yield item def get_json_key3(content):
if isinstance(content, dict) and len(content) > 0:
for key in content.keys():
yield key
yield from get_json_key3(content[key]) read_json_key(JSON_PATH)
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}, 'test4': {'test4_2': {'test4_3': {'test4_4': {'test4_5': 4}}}}, 'test5': 5}
9.298324584960938e-06
data_list:['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
get_json_key2: ['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
1.7642974853515625e-05
get_json_key3: ['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
1.5974044799804688e-05

上述均使用了递归,分别使用了普通的列表存取,yield, yield from,使用yield和yield from可以减少内存消耗

python 操作json数据的更多相关文章

  1. Python操作JSON数据代码示例

    #!/usr/bin/env python import json import os def json_test(): return_dic = {} json_data = { 'appid':' ...

  2. python操作json来存储简单的数据,pickle来操作复杂的数据

    json作为不同语言间进行数据交互的媒介,在当下已经渐渐取代了之前的xml,看一波python操作json # coding = ascii import json import pickle imp ...

  3. python 发送json数据操作实例分析 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文实例讲述了python 发送json数据操作.分享给大家供大家参考,具体如下: # !/usr/bin/env py ...

  4. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  5. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

  6. Python读取JSON数据,并解决字符集不匹配问题

    今天来谈一谈Python解析JSON数据,并写入到本地文件的一个小例子. – 思路如下 从一个返回JSON天气数据的网站获取到目标JSON数据串 使用Python解析出需要的部分 写入到本地文件,供其 ...

  7. Jquery重新学习之五[操作JSON数据]

    Jquery操作Json格式的数据在我们平时的项目中也经常运用:最近看Jquery权威指南中就有一章节是对这方面的整理总结:最后通过一个Asp.net结合一般处理程序ashx的实例,基本上能满足项目中 ...

  8. 【Python】python和json数据相互转换,json读取和写入,repr和eval()使用

    python数据转换json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import jso ...

  9. vim调用python格式化json数据

    vim调用python格式化json数据 November 30, 2013GNU/Linuxpython3, Vimopenwares python有个标准模块叫json,用于编码/解码,序列化/按 ...

随机推荐

  1. C++进阶-3-6-map/multimap容器

    C++进阶-3-6-map/multimap容器 1 #include<iostream> 2 #include<map> 3 using namespace std; 4 5 ...

  2. Rainbond结合NeuVector实践容器安全管理

    前言 Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器.Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期.但是随着云原生时代的一点点 ...

  3. 通过Go实现AES加密和解密工具

    本文包含如下两个内容: AES加密介绍及实现原理 Go实现AES加密和解密工具 AES加密介绍及实现原理 AES( advanced encryption standard)使用相同密钥进行加密和解密 ...

  4. hooks 与 animejs

    hooks 与 animejs 本文写于 2020 年 1 月 13 日 animejs 是现如今非常不错的一个 js 动画库.我们将其与 React Hooks 融合,使它更方便的在 React 中 ...

  5. Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom

    这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...

  6. 145_Power BI Report Server自定义Form登录

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 很久没有更新Power BI Report Server了,发现自己机器还是2021年1月版本的,现在更新了20 ...

  7. [论文][表情识别]Towards Semi-Supervised Deep Facial Expression Recognition with An Adaptive Confidence Margin

    论文基本情况 发表时间及刊物/会议:2022 CVPR 发表单位:西安电子科技大学, 香港中文大学,重庆邮电大学 问题背景 在大部分半监督学习方法中,一般而言,只有部分置信度高于提前设置的阈值的无标签 ...

  8. 使用git提交和拉取gitee的代码

    使用git提交和拉取gitee的代码 1. 安装Git(自行摸索) 2. 在gitee新建仓库 名称和路径自己写 这两个二选一足矣 默认分支master就行 复制这个链接,待会要用 3. 新建项目目录 ...

  9. 皓远的第二次博客作业(最新pta集,链表练习及期中考试总结)

    前言: 知识点运用:正则表达式,有关图形设计计算的表达式和算法,链表的相关知识,Java类的基础运用,继承.容器与多态. 题量:相较于上次作业,这几周在java方面的练习花了更多的精力和时间,所要完成 ...

  10. 封装一个基础的vue-router

    前言主要知识点: 路由原理 Hash与History 实现路由 一.一个vue路由的工作原理前端路由与后端路由的区别: 后端路由:输入url>请求发送到服务器>服务器解析请求的路径> ...