JSON 文件存储

article/2025/9/29 17:13:31

📋 个人简介
💖 作者简介:大家好,我是W_chuanqi,一个编程爱好者
📙 个人主页:W_chaunqi
😀 支持我:点赞👍+收藏⭐️+留言📝
💬 愿你我共勉:“若身在泥潭,心也在泥潭,则满眼望去均是泥潭;若身在泥潭,而心系鲲鹏,则能见九万里天地。”✨✨✨

文章目录

  • JSON 文件存储
    • 1.对象和数组
    • 2.读取 JSON
    • 3.输出 JSON

JSON 文件存储

​ JSON,全称为Java Script Object Notation,也就是 JavaScript对象标记,通过对象和数组的组合来表示数据,虽构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。

​ 下面我们就来了解如何利用 Python 将数据存储为 JSON 文件。

1.对象和数组

​ 在 JavaScript 语言中,一切皆为对象,因此任何支持的数据类型都可以通过 JSON 表示,例如子符串、数字、对象、数组等。其中对象和数组是比较特殊且常用的两种类型,下面简要介绍一下这两者。

​ 对象在 JavaScript 中是指用花括号{}包围起来的内容,数据结构是{key1:value1,key2:value2,…}这种键值对结构。在面向对象的语言中,key 表示对象的属性、value 表示属性对应的值,前者可以使用整数和字符串表示,后者可以是任意类型。

​ 数组在 JavaScript 中是指用方括号[]包围起来的内容,数据结构是[“java”,“javascript”,“vb”,…】这种索引结构。在 JavaScript 中,数组是一种比较特殊的数据类型,因为它也可以像对象那样使用键值对结构,但还是索引结构用得更多。同样,它的值可以是任意类型。

​ 所以,一个 JSON 对象可以写为如下形式:

[{"name":"Bob","gender":"male","birthday":"1992-10-18"
},
{"name":"Selina","gender":"female","birthday":"1995-11-16"
}]

​ 由[]包围的内容相当于数组,数组中的每个元素都可以是任意类型,这个实例中的元素是对象,由{}包围。

​ JSON 可以由以上两种形式自由组合而成,能够嵌套无限次,并且结构清晰,是数据交换的极佳实现方式。

2.读取 JSON

​ Python 为我们提供了简单易用的 JSON 库,用来实现 JSON 文件的读写操作,我们可以调用JSON库中的 loads 方法将 JSON 文本字符串转为 JSON 对象。实际上,JSON 对象就是 Python 中列表和字典的嵌套与组合。反过来,我们可以通过 dumps 方法将 JSON 对象转为文本字符串。

​ 例如,这里有一段 JSON 形式的字符串,是 str 类型,我们用 Python 将其转换为可操作的数据结构,如列表或字典:

import json
str = '''
[{"name":"Bob","gender":"male","birthday":"1992-10-18"
},
{"name":"Selina","gender":"female","birthday":"1995-11-16"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

​ 运行结果如下:
image-20220724123053239

​ 这里使用 loads 方法将字符串转为了 JSON 对象。由于最外层是中括号,所以最终的数据类型是列表类型。

​ 这样一来,我们就可以用索引获取对应的内容了。例如,要想获取第一个元素里的 name 属性,可以使用如下方式:

import json
str = '''
[{"name":"Bob","gender":"male","birthday":"1992-10-18"
},
{"name":"Selina","gender":"female","birthday":"1995-11-16"
}]
'''
data = json.loads(str)
print(data[0]['name'])
print(data[0].get('name'))

输出结果为:

image-20220724123445879

​ 以中括号加0作为索引,可以得到第一个字典元素,再调用其键名即可得到相应的键值。获取键值的方式有两种,一种是中括号加键名,另一种是利用get方法传入键名。这里推荐使用 get方法,这样即使键名不存在,也不会报错,而是会返回None。另外,get 方法还可以传入第二个参数(即默认值),实例如下:

import json
str = '''
[{"name":"Bob","gender":"male","birthday":"1992-10-18"
},
{"name":"Selina","gender":"female","birthday":"1995-11-16"
}]
'''
data = json.loads(str)
print(data[0].get('age'))
print(data[0].get('age', 25))

​ 运行结果如下:

​ 第二个参数,就会返回传入的这个值。 这里我们尝试获取年龄 age,原字典中并不存在该键名,因此会默认返回 None。此时如果传人了第二个参数,就会返回传入的这个值。

​ 值得注意的是,JSON 的数据需要用双引号包围起来,而不能使用单引号。例如使用如下形式,就会出现错误:

import json
str = '''
[{'name':'Bob','gender':'male','birthday':'1992-10-18'
}]
'''
data = json.loads(str)

​ 运行结果如下:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)

​ 这里出现了 JSON 解析错误的提示,其原因就是数据由单引号包围着。再次强调,请千万注意 JSON 字符串的表示需要用双引号,否则 loads 方法会解析失败。 下面实现从 JSON 文本中读取内容,例如有一个 data.json 文本文件,其内容是刚才定义的JSON字 符串,我们可以先将文本文件中的内容读出,再利用 loads 方法将之转化为 JSON 对象:

import jsonwith open('data.json', encoding='utf-8') as file:str = file.read()data = json.loads(str)print(data)

​ 运行结果如下:

image-20220724212740788

​ 这里我们使用 open 方法读取文本文件,使用的是默认的读模式,编码指定为 utf-8,并文件操作对象赋值为 file。然后我们调用 file 对象的 read 方法读取了文本中的所有内容,赋值为 str。接都再调用 loads 方法解析 JSON 字符串,将其转化为 JSON 对象。

​ 其实上述实例有更简便的写法,可以直接使用 load 方法传入文件操作对象,同样也可以将文本转化为 JSON 对象,写法如下:

import jsondata = json. load(open('data.json', encoding='utf-8'))
print(data)

​ 注意这里使用的是 load 方法,而不是 loads 方法。前者的参数是一个文件操作对象,后者的参数是一个 JSON 字符串。

​ 这两种写法的运行结果是完全一样的。只不过 load 方法是将整个文件中的内容转化为 JSON 对象,而 loads 方法可以更灵活地控制要转化哪些内容。两种方法可以在适当的场景下选择使用。

3.输出 JSON

​ 可以调用 dumps 方法将 JSON 对象转化为字符串。例如,将上面例子的运行结果中的列表重新写入文本:

​ 这里利用 dumps 方法,将 JSON 对象转为了字符串,然后调用文件的 write 方法将字符串写入文本,结果如下图所示。

image-20220724215040524

​ 另外,如果想保存 JSON 对象的缩进格式,可以再往 dumps 方法中添加一个参数 indent,代表缩进字符的个数。实例如下:

import json
data = [{'name': 'Bob','gender': 'male','birthday': '1992-10-18'
}]
with open('data.json', 'w', encoding='utf-8') as file:file.write(json.dumps(data, indent=2))

​ 此时写入结果如图所示。

image-20220724215327926

​ 能够看出,得到的内容自带缩进,格式更加清晰。

​ 另外,如果 JSON 对象中包含中文字符,会怎么样呢?现在将之前 JSON 对象中的部分值改为中文,并且依然用之前的方法将之写入文本:

import json
data = [{'name': '张三','gender': '男','birthday': '1992-10-18'
}]
with open('data.json', 'w', encoding='utf-8') as file:file.write(json.dumps(data, indent=2))

写入结果如图所示:

image-20220724220238959

​ 可以看到,文本中的中文字符都变成了 Unicode 字符,这显然不是我们想要的结果。

​ 要想输出中文,还需要指定参数 ensure_ascii 为 False,以及规定文件输出的编码:

import json
data = [{'name': '张三','gender': '男','birthday': '1992-10-18'
}]
with open('data.json', 'w', encoding='utf-8') as file:file.write(json.dumps(data, indent=2, ensure_ascii=False))

此时的写入结果如图:

image-20220724220624083

​ 能够发现,现在可以将JSON 对象输出为中文了。

​ 类比 loads 与 load 方法,dumps 同样也有对应的 dump 方法,它可以直接将 JSON 对象全部写入文件中,因此上述写法也可以写为如下形式:

json.dump(data, open('data.json','w', encoding='utf-8'), indent=2, ensure_ascii=False)

​ 这里第一个参数是 JSON对象,第二个参数可以传入文件操作对象,其他的 indent、ensure_ascii对象还是保持不变,运行结果是一样的。


http://chatgpt.dhexx.cn/article/nupJwK0X.shtml

相关文章

JSON 文件格式

最近的开发中用到了JSON文件,JSON是网络中比较常用的数据交换格式,Google chrome 浏览器的书签文件就采用了JSON格式。 以下是官方网站对JSON的介绍,URL:http://json.org//json-zh.html JSON(JavaScript Object Notation) 是一种…

json文件格式标准

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使…

Json文件格式化方法

1. JSON 是一种存储和交换数据的语法 当数据在浏览器与服务器之间进行交换时,这些数据只能是文本。 JSON 属于文本,并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。 我们也能把从服务器接收到的任何 JSON 转换…

JSON的三种格式

JSON的三种格式 一、 JSON的全称 JSON的全称是JavaScript Object Notation 二、为什么需要JSON JSON有三种格式,每一种写法都和JS中的数据类型很像,可以很轻松的和JS中的数据类型互相转换 三、JSON的三种格式 (一)、简单值的形式…

JSON文件格式

前言: JSON是个什么东东? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易解析。…

编程小白自学Java开发FlyBird小游戏

本人在读大学生一枚,在上个月自学了半个月的Java,现在寒假放假有空闲时间,用三天肝爆出一款之前爆火的小游戏,FlyBird,用的是IDEA开发环境。 参考了B站代码帝国的教学思路,在面向对象和构造方法中花费了不…

java fly bird小游戏_java swing实现的小游戏flybird源码附带视频配置修改教程

大家好,今天给大家演示一下由Java swing实现的一款小游戏flybird,该游戏操作比较简单,点击鼠标确保小鸟不要触碰到柱子即可,该游戏可运行在Java环境下,jdk版本不限,下面我们来看看如何运行以及简单的修改游…

html+css+js实现小游戏flybird(完整版)

完整demo下载资源https://download.csdn.net/download/qq_30548105/10847675 从未做过前端的游戏,哪怕不是用引擎实现的小游戏也没做过,这次试了一下,参考了一些资料,资料也不是很完整,于是就自己补齐写了一个…

JS实现FlyBird

放假等毕业还是挺无聊的,正好闲着没事做就学了学JS,也算是重拾吧,照着视频写了一个,然后。。。视频源找不到了 1.环境和工具 windows10 WebStrom2018.1.4 测试直接用的webstrom里面的 2.运行截图 类似于这样,然后…

纯C语言编程-游戏之Fly Bird

基于纯C的小游戏,基本思想就是使用system("cls")和printf()函数不断刷新界面,捕获键盘事件,然后修改显示数组,并刷新界面。 之前有一款特别火爆的小游戏FlyBird,我们可以使用纯C语言实现,希望对…

飞翔的小鸟(FlyBird)游戏C语言编程(含撞柱子)

// 飞翔的小鸟.cpp #include "stdafx.h" #include <graphics.h> //图形库头文件 #include <stdlib.h> //Sleep #include <conio.h> //_getch()按键盘 #include <stdio.h> //C语言头文件 #include <time.h> //随机函数使…

【Unity】Fly Bird(游戏实战)(1)

对于Fly Bird 相信各位肯定不会陌生。&#xff08;在安卓5.0-7.0版本的系统中多次点击Android Version 就会出现这个游戏&#xff0c;快去试试吧~~ 7.0及以后就没有了~~就做不了示范了 ~~ 刚开始Unity&#xff0c;也是写的第一个游戏就是做一个Fly Bird. 先把用到的音频&…

Scratch(三十五):FlyBird

哈喽&#xff0c;大家好&#xff01;今天给大家展示的Scratch是FlyBird。接下来&#xff0c;我们一起看一下效果吧。 1、素材获取 2、bird的设置 当点击完小绿旗之后&#xff0c;bird就会有个上下浮动的控制&#xff0c;也就是变量“重力”的设置&#xff0c;接着就是开始位置…

Html5在线小游戏 在线玩压扁小鸟(flyBird)游戏源码

这个源码无需后台上传服务器&#xff0c;直接在线即可使用。 该游戏源码是基于HTML5和JavaScript开发的&#xff0c;运行在浏览器中&#xff0c;使得用户能够方便地进行游戏&#xff0c;而且不需要进行任何安装和下载操作。想要玩游戏的用户只需要访问指定链接即可开始游戏&am…

cocos游戏FlyBird

cocos creator游戏开发FlyBird 菜单界面Menu 首先建立一个场景&#xff08;scence&#xff09; 将你的背景图片添加入canvas并调整canvas的大小来适应你背景图片的大小&#xff0c;最好不要去图片大小&#xff0c;这样会使你的图片变得很丑 添加一个按钮控件 并给这个场景添…

java fly bird小游戏_JavaScript实现Fly Bird小游戏

3.1 小鸟 首先&#xff0c;创建小鸟的对象&#xff0c; bird.js 文件。 div:document.createElement("div"),showBird:function(parentObj) { this.div.style.width "40px"; this.div.style.height "28px"; this.div.style.backgroundImage &…

FLY BIRD

这是作品需要的角色…… 注:水管要多弄几个造型例如: (作者用的背景是blue sky(scratch素材库里面的)) 一下是水管的程序: 小鸟的也很简单:

Java之编写FlyBird小游戏

Java小游戏编写&#xff08;飞翔的小鸟&#x1f426;&#xff09; 概述&#xff1a;主要使用面向对象&#xff0c;线程&#xff0c;继承、ImageIO流等完成的一个小游戏 主要文件&#xff1a; &#x1f405;&#x1f389;&#x1f405;&#x1f389;&#x1f405;&#x1f389;…

介绍一款2023年新出的mysql管理工具: FlyBird Database Manager

FlyBird Database Manager 介绍 FlyBird Database Manager 是一款mysql 界面化管理工具&#xff0c; 使用go语言编写&#xff0c;天然支持Windows, MacOS, Linux等主流平台。 提供无需安装的命令行版本&#xff0c; 命令行中启动服务&#xff0c;以html支持UI界面,在浏览器中…

网络打印机无法连接的解决方法

&#xfeff;&#xfeff; 网络 打印机无法连接的解决方法。 1、首先确定计算机是否可以连接网络打印机&#xff0c;网络打印机都会有一个内网ip地址&#xff0c;可以先ping一下看通不通&#xff0c;如果不通说明计算机与网络打印机之间线路不通&#xff0c;可以用排除法看看是…