当前位置: 首页 > news >正文

JSON 文件存储

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

对象和数组

在 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-10-18"
}]

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

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

读取 JSON

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

 

import json

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

<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>

这里使用 loads 方法将字符串转为了 JSON 对象。 由于最外层是中括号,所以最终的数据类型是列表类型,这样,我们就可以用索引获取内容了。

data[0]['name']
data[0].get('name')

'Bob'

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

print(data[0].get('age'))
data[0].get('age', 25)

None
25

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

值得注意的是: JSON  的数据需要用双引号包围起来, 而不能使用单引号。 

import json

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

这里教程里说的是会报错,但是我这里实际运行并没有报错而是正确运行了,不过双引号,还是要注意一下的

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

读取 json 文本文件

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

这里首先需要你有一个 data.json 的文本文件,其内容是刚刚定义的字符串。

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

简单写法:

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

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

这两种写法的结果完全一样, 只不过 load 方法是将整个文件中的内容转化为 JSON 对象, 而 loads 方法 可以更灵活的控制转化哪些内容。 

输出 JSON

可以调用 dumps 方法将 JSON 对象转化为字符串。

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))

这里利用 dumps 方法, 将 JSON 对象转为字符串, 然后调用文件的 write 方法将字符串写入文本

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

with open('data.json', 'w') as file:
    file.write(json.dumps(data,indent=2))

感觉并没有什么变化

那么如果存在中文会怎么样

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))

我的显示正常, 教程说是会有问题,会显示 Unicode 字符

解决方法

with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))

在 json.dumps 中添加一个 ensure_ascii=False

类比 loads 和 load 方法 ,  dumps 和 dump 也有简写方法

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

这里第一个参数传入 JSON 对象, 第二个参数可以传入文件操作对象,其他保持不变,运行结果一样

 

相关文章:

JSON 文件存储

JSON 全称为&#xff1a; JavaScript Object Notation 也就是 javaScript 对象标记&#xff0c;通过对象和数组的组合来表示数据&#xff0c; 虽然构造简洁&#xff0c;但是结构化程度非常高&#xff0c; 是一种轻量级的数据交换格式 对象和数组 在 JavaScript 语言中&#…...

python——pynput

pynput 是一个 Python 库&#xff0c;用于控制和监听键盘与鼠标输入。它在 Windows、macOS 和 Linux 上都可以工作&#xff0c;为用户提供了一个跨平台的输入事件处理方式。pynput 包含两个主要模块&#xff1a;keyboard 和 mouse&#xff0c;分别用于处理键盘和鼠标事件。 主…...

[用AI日进斗金系列]用码上飞在企微接单开发一个项目管理系统!

今天是【日进斗金】系列的第二期文章。 先给不了解这个系列的朋友们介绍一下&#xff0c;在这个系列的文章中&#xff0c;我们将会在企微的工作台的“需求发布页面”中寻找有软件开发需求的用户 并通过自研的L4级自动化智能软件开发平台「码上飞CodeFlying」让AI生成应用以解…...

《JavaEE篇》--多线程(2)

《JavaEE篇》--多线程(1) 线程安全 线程不安全 我们先来观察一个线程不安全的案例&#xff1a; public class Demo {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {//让count自增5W次…...

防爆智能手机如何助力电气行业保驾护航?

在电气行业的智能化转型浪潮中&#xff0c;防爆智能手机以其强大的数据处理能力、实时通讯功能及高度集成的安全特性&#xff0c;正成为保障电力网络稳定运行、预防安全隐患的得力助手。 防爆智能手机在电气行业中发挥着重要的保驾护航作用&#xff0c;主要体现在以下几个方面&…...

24.7.24数组|那几个课后得做的题

1、对长整形数据进行反转 2、对字符串进行反转 一、题目地址&#xff1a; 1. 实现一个函数atoi&#xff0c;使其能够将字符串转换整数 (Leetcode 8/中等). - 力扣&#xff08;LeetCode&#xff09; 2. 颠倒给定的32位无符号整数的二进制位&#xff08;Leetcode 190/简单&…...

03Spring底层架构核心概念解析

为了感谢罕哥对我工作的帮助&#xff0c;特此记录下学习过程&#xff0c;期待成为和罕哥一样优秀的人 时间&#xff1a;2024.7.13 内容&#xff1a;spring源码课程3学习记录 一、BeanDefinition BeanDefinition表示Bean的定义&#xff0c;BeanDefinition中存在很多属性用来…...

Vue学习---vue 防抖处理函数,是处理什么场景

Vue防抖处理函数是用来处理在快速连续操作中&#xff0c;只执行最后一次操作的情况。 例如&#xff0c;在输入框输入时&#xff0c;我们可能希望只在用户完成输入后进行处理&#xff0c;而不是在每次键入时都处理。(n秒后触发一次) 以下是一个简单的Vue防抖处理函数的例子&am…...

力扣爆刷第166天之TOP100五连刷96-100(单词拆分、回溯、旋转数组)

力扣爆刷第166天之TOP100五连刷96-100&#xff08;单词拆分、回溯、旋转数组&#xff09; 文章目录 力扣爆刷第166天之TOP100五连刷96-100&#xff08;单词拆分、回溯、旋转数组&#xff09;一、24. 两两交换链表中的节点二、139. 单词拆分三、560. 和为 K 的子数组四、209. 长…...

2024在线PHP加密网站源码

源码介绍 2024在线PHP加密网站源码 更新内容: 1.加强算法强度 2.优化模版UI 加密后的代码示例截图 源码下载 https://download.csdn.net/download/huayula/89568335...

网络驱动移植(RTL8189)

1、把驱动放到内核文件夹中&#xff08;linux/drivers/net/wireless&#xff09;&#xff0c;对应的驱动可以在网上下载 2、修改该目录下的Kconfig和Makefile文件 3、配置内核&#xff08;make menuconfig&#xff09; 配置支持IEEE 802.11&#xff0c;选中8189模块&#xff0…...

go语言中map学习

在 Go 语言中,map 是一种引用类型,这意味着它有以下特点: 内存结构: map 实际上是一个指向底层数据结构的指针。这个底层数据结构包含键值对的集合。 赋值与传参: 当你给一个变量赋值一个 map 时,或者将 map 作为函数参数传递时,实际上传递的是指针,而不是完整的数据结构副本。…...

【C#】| 与 及其相关例子

按位或&#xff08;|&#xff09; 按位或运算符 | 对两个数的每一位进行比较&#xff0c;如果两个数中至少有一个为 1&#xff0c;则结果位为 1&#xff1b;否则&#xff0c;结果位为0。 1010 (10 in decimal) | 1100 (12 in decimal) ------1110 (14 in decimal) 力扣相关…...

【数据结构 | 哈希表】一文了解哈希表(散列表)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

go创建对象数组

在 Go 语言中&#xff0c;可以使用字面量的方式创建结构体对象数组。以下是一个示例代码&#xff0c;展示了如何使用字面量创建一个结构体对象数组&#xff1a; package mainimport "fmt"// 定义一个结构体 type Person struct {Name stringAge intAddress Address…...

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }...

自动化网络爬虫:如何它成为提升数据收集效率的终极武器?

摘要 本文深入探讨了自动化网络爬虫技术如何彻底改变数据收集领域的游戏规则&#xff0c;揭示其作为提升工作效率的终极工具的奥秘。通过分析其工作原理、优势及实际应用案例&#xff0c;我们向读者展示了如何利用这一强大工具加速业务决策过程&#xff0c;同时保持数据收集的…...

软件测试---测试需求分析

课程目标 什么是软件测试需求 软件测试需求的必要性 如何对软件测试需求进行分析&#xff08;重点&#xff09; 课程补充 灰度测试&#xff08;基于功能&#xff09;&#xff1a;先发布部分功能&#xff0c;然后看用户的反馈&#xff0c;再去发布另外一部分的功能更新。 A/B测…...

Android11 framework 禁止三方应用通过广播开机自启动-独立方案

之前的文章Android11 framework 禁止三方应用开机自启动记录了我调试Android11应用自启动限制的全过程&#xff0c;但是之前的方案感觉还能再研究&#xff0c;所以有了这一篇文章。 这一篇文章主要探讨Android11上&#xff0c;以广播来进行自启动的应用的限制&#xff0c;极个别…...

Node:解决Error: error:0308010C:digital envelope routines::unsupported的解决方法

问题描述 在使用vuepress搭建博客的时候&#xff0c;运行项目发现报错了&#xff0c;检查了node的版本是18&#xff0c;之前用的是16或14的版本&#xff0c;现在报&#xff1a;Error: error:0308010C:digital envelope routines::unsupported错误。 查找了一些资料&#xff0…...

SEO_避开这些常见误区,让你的SEO效果翻倍

<h2>避开这些常见误区&#xff0c;让你的SEO效果翻倍</h2> <p>在当今的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了每个网站和博客运营者必须掌握的技能之一。许多人在进行SEO时却会犯一些常见的错误&#xff0c;这些错误不仅…...

UE4SS虚幻引擎Mod开发工具:从技术痛点到生态共建的完整指南

UE4SS虚幻引擎Mod开发工具&#xff1a;从技术痛点到生态共建的完整指南 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE…...

基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术&#xff0c;强化对沧交食堂食品安全的监管力度&#xff0c;提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...

【FastAPI 2.0流式AI响应终极指南】:20年架构师亲授异步SSE/Chunked Transfer实战避坑清单

第一章&#xff1a;FastAPI 2.0流式AI响应面试概览在现代AI应用开发中&#xff0c;面试场景下的实时交互体验正成为关键评估维度。FastAPI 2.0 引入了对原生异步流式响应&#xff08;StreamingResponse&#xff09;的深度优化&#xff0c;支持 Server-Sent Events&#xff08;S…...

对话意图识别新选择:轻量ESFT模型高效易用

对话意图识别新选择&#xff1a;轻量ESFT模型高效易用 【免费下载链接】ESFT-token-intent-lite 基于HuggingFace平台&#xff0c;deepseek-ai团队推出的ESFT-token-intent-lite模型&#xff0c;是ESFT-vanilla-lite的精简版&#xff0c;专为意图识别优化&#xff0c;性能卓越&…...

s2-pro语音合成教程:支持数字/单位/英文缩写智能朗读技巧

s2-pro语音合成教程&#xff1a;支持数字/单位/英文缩写智能朗读技巧 1. 快速了解s2-pro语音合成 s2-pro是Fish Audio开源的专业级语音合成模型镜像&#xff0c;它能将文本转换为自然流畅的语音。这个工具特别适合需要语音播报、有声读物制作、视频配音等场景的用户。 与普通…...

驯服失控菜单:让右键操作提速60%的实战指南

驯服失控菜单&#xff1a;让右键操作提速60%的实战指南 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 当你在Windows系统中右键点击文件时&#xff0c;是否曾面…...

7个高级配置技巧:打造极致Markdown预览体验

7个高级配置技巧&#xff1a;打造极致Markdown预览体验 【免费下载链接】vscode-markdown-preview-enhanced One of the "BEST" markdown preview extensions for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdown-preview-enhanc…...

# Kafka 消息队列实战指南

大数据开发核心技能&#xff1a;Kafka 架构原理、生产者消费者配置、Spark/Flink 集成、消息积压处理、数据一致性保障、生产环境案例&#xff0c;从 0 到 1 掌握企业级消息队列&#x1f4cc; 前言 真实生产问题 问题场景&#xff1a; 某电商公司数据平台遇到的问题&#xff1a…...

银河麒麟V4.0.2-sp4服务器到手后,这三步网络配置(IP/DNS/源)一个都不能少

银河麒麟V4.0.2-sp4服务器网络配置实战指南&#xff1a;从零搭建稳定运行环境 刚拿到一台预装银河麒麟V4.0.2-sp4操作系统的服务器时&#xff0c;许多运维工程师常会陷入"有设备却用不起来"的困境——无法远程连接、软件包安装失败、系统更新卡壳&#xff0c;这些问题…...