JSON学习笔记
文章目录
- 1. JSON是什么
- 2. JSON的特点与结构
- 3. JSON的使用
- 4. JSON文件读取
1. JSON是什么
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON起源于JavaScript语言,但已成为一种独立于编程语言的数据格式。它由键值对组成,类似于JavaScript中的对象,但更加简洁和通用化。JSON数据以文本形式存储,易于解析和生成,因此被广泛应用于数据交换和存储。
2. JSON的特点与结构
JSON的特点
- 文本格式:JSON是一种纯文本格式,可以存储和传输数据。
- 语言无关性:虽然基于JavaScript,但JSON可以被多种编程语言解析。
- 数据交换:常用于Web应用之间的数据交换。
- 易于阅读和编写:格式简洁,易于理解和使用。
- 自我描述:结构清晰,不需要额外的解释文档。
JSON的基本结构
JSON数据格式支持以下几种数据结构:
- 对象:由花括号{}包围,包含一系列键值对。
- 数组:由方括号[]包围,包含一系列值。
- 字符串:必须用双引号"包围。
- 数字:整数或浮点数。
- 布尔值:true或false。
- null:表示空值。
3. JSON的使用
为什么要用json文件应用比较多呢?
我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。
- 相对于txt,word来说,json格式更加明确,获取重要信息非常方便。
- 相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。
- 相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。
- 相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。json可以直接使用。
在数据传输使用时一般创建好JSON数据之后序列化为字符串再传输,接收方收到数据后再反序列化为字符串获取数据
在存储数据时的使用类似于简化版的键值对
这里展示cpp的使用
演示如下:
// json序列化示例代码
#include "json.hpp"
using json = nlohmann::json;#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;string func()
{json js;// 直接序列化一个vector容器vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(5);js["list"] = vec;// 直接序列化一个map容器map<int, string> m;m.insert({1, "挺好的?"});m.insert({2, "华山"});m.insert({3, "泰山"});js["path"] = m;string sendBuf = js.dump(); // json数据对象 =》序列化 json字符串//cout<<sendBuf<<endl;return sendBuf;
}int main()
{string recvBuf_1=func();json jsbuf_1=json::parse(recvBuf_1);//反序列化cout<<jsbuf_1["path"]<<endl;map<int,string> mymap=jsbuf_1["path"];for(auto t:mymap){cout<<t.second;}vector my_vector = jsbuf_1["list"];for(auto item:my_vector){cout<<item;}return 0;
}
4. JSON文件读取
定义的JSON数据结构如下
"Group Name" : "Togehter",
"Number" : 2,
"Students" : {"Lisi" : [165,50],"Zhangsan" : [180,70]
}
写文件如下:
#include <iostream>
#include <fstream>
#include "json.hpp"using namespace std;int main() {//根节点Json::Value root;root["Group Name"] = "Togehter";root["Number"] = 2;//Map形式root["Students"]["Zhangsan"].append(180);root["Students"]["Zhangsan"].append(70);root["Students"]["Lisi"].append(165);root["Students"]["Lisi"].append(50);//父子节点形式Json::Value student;student["Zhangsan"].append(180);student["Zhangsan"].append(70);student["Lisi"].append(165);student["Lisi"].append(50);root["Students"] = student;//格式化输出到文件 ofstream os; //实例化输出类os.open("test.json", std::ios::out); //打开并指定文件以输出方式打开(往文件里写)if (!os.is_open()) //检查文件打开情况cout << "open file failed" << endl;Json::StyledWriter sw; //定义格式化输出os << sw.write(root); //输出到文件 os.close(); //关闭文件return 0;
}
针对含有二级对象的内容,可以使用以下两种方式:
(1)map形式,这种方式较为简单,但缺点就是只能处理相对比较简单的二级对象。
在一级对象后直接跟不同的二级对象作为区分,并针对二级对象进行赋值或添加的操作。
root["Students"]["Zhangsan"].append(180); //添加身高信息
root["Students"]["Zhangsan"].append(70); //添加体重信息root["Students"]["Lisi"].append(165); //添加身高信息
root["Students"]["Lisi"].append(50); //添加体重信息
(2)父子节点的形式,这种方法可以定义更为复杂的形式,缺点就是定义起来较为麻烦。
定义子节点,然后按照与根节点相同的方式对子节点进行处理,最后将其链接到根节点即可。
Json::Value student; //定义子节点
student["Zhangsan"].append(180);
student["Zhangsan"].append(70);student["Lisi"].append(165);
student["Lisi"].append(50);root["Students"] = student; //将子节点链接到根节点上
读取文件较为简单,如下:
#include <iostream>
#include <fstream>
#include "json.hpp"using namespace std;int main() {Json::Reader reader;Json::Value root;ifstream is("test.json", ios::binary); //打开文件,以二进制方式打开文件if (!is.is_open()) //检查文件打开情况cout << "open file failed" << endl;if (reader.parse(is, root)) {//读取根节点信息string group_name = root["Group Name"].asString();int number = root["Number"].asInt();cout << "Group Name: " << group_name << endl;cout << "Number: " << number << endl;//读取子节点信息int body[2]; //身高、体重/********注意遍历json数组的时候要使用unsigned int的变量********/body[0] = root["Students"]["Zhangsan"][(unsigned int)0].asInt(); body[1] = root["Students"]["Zhangsan"][(unsigned int)1].asInt();cout << "Zhangsan height:" << body[0] << " weight: " << body[1] << endl;body[0] = root["Students"]["Lisi"][(unsigned int)0].asInt();body[1] = root["Students"]["Lisi"][(unsigned int)1].asInt();cout << "Lisi height:" << body[0] << " weight: " << body[1] << endl;}is.close();return 0;
}
相关文章:
JSON学习笔记
文章目录 1. JSON是什么2. JSON的特点与结构3. JSON的使用4. JSON文件读取 1. JSON是什么 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和…...
高阶指南:动态定价下eBay利润率控制的4维财务模型
在eBay平台上,动态定价(Dynamic Pricing)早已不是新鲜概念。随着市场供需的瞬时波动、竞争产品的变化,以及跨境电商红海局势的加剧,卖家若想在残酷的价格战中保住利润、稳住运营基本盘,仅靠经验主义已经远远…...
【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】
你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt:用户传入的提示词(如 “请分析这篇作文的主题”),指导模型执行任务 client&…...
Keil MDK中禁用半主机(No Semihosting)
在 ARM 编译器(如 Keil MDK) 中禁用半主机(Semihosting)并实现标准库的基本功能,需要以下步骤: 1. 禁用半主机 #pragma import(__use_no_semihosting) // 禁用半主机模式作用:防止标准库函数&…...
QML中的3D功能--纹理应用
Qt 3D 提供了强大的纹理支持,可以实现各种复杂的材质效果。以下是 Qt 3D 纹理开发的全面技术方案。 一、纹理处理的流程图 纹理处理关键步骤说明: 资源准备阶段 支持格式:PNG/JPG/KTX/DDS等 尺寸要求:建议2的幂次方(非强制) 纹理加载路径 qml Texture2D {source: "…...
LeetCode[459]重复的子字符串(KMP解法)
思路: 最近迷上了KMP算法,所以这道题也是来搞一下KMP算法,总所周知KMP是需要维护一个前缀表,KMP算法不是比较一个字符串包不包含另一个字符串的吗,这个重复字符串的题也能用?猫爷:毋庸置疑&…...
数据驱动未来:大数据在智能网联汽车中的深度应用
数据驱动未来:大数据在智能网联汽车中的深度应用 引言 随着智能网联汽车(Intelligent Connected Vehicles,ICV)的快速发展,数据已成为其核心驱动力。从实时交通数据到车辆传感器信息,大数据的深度应用正在让智能汽车更安全、更高效、更智能化。那么,大数据如何赋能智能…...
基于MCP的RAG系统实战:用Cursor+GroundX构建复杂文档问答引擎
在AI与文档处理的融合趋势下,基于MCP协议的RAG(Retrieval-Augmented Generation)系统为复杂文档的智能问答提供了全新解决方案。本文将详细解析如何通过Cursor编辑器(MCP客户端)与GroundX(MCP服务器)的组合,构建一个可处理科研文献、企业知识库的端到端问答系统,并提供…...
DSA数据结构与算法 4
第2章 排序技术 2.1 排序简介 排序是将数据按照特定顺序(升序或降序)排列的过程,它不仅是计算机科学中的基础操作,也是日常生活中不可或缺的工具。举个例子,想象一个图书馆里的书籍,如果这些书籍没有按照作…...
23种设计模式全解析及其在自动驾驶开发中的应用
一、创建型模式(5种) 目标:解耦对象创建过程,提升系统灵活性 模式名称核心思想典型场景自动驾驶应用示例工厂方法子类决定实例化对象类型日志系统、数据库连接器创建激光雷达/摄像头等传感器实例抽象工厂创建相关对象家族GUI组件…...
基于WiFi的智能教室数据监测系统的设计与实现
标题:基于WiFi的智能教室数据监测系统的设计与实现 内容:1.摘要 随着教育信息化的发展,对教室环境及设备数据监测的智能化需求日益增长。本文的目的是设计并实现一种基于WiFi的智能教室数据监测系统。方法上,采用WiFi模块实现数据的无线传输,…...
Linux操作系统--环境变量
目录 基本概念: 常见环境变量: 查看环境变量的方法: 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式:编辑 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 环境变量通常具有全局属性 基本概念…...
备份jenkins
jenkins用熟了很爽,jenkins用熟了很香,jenkins用熟了可以起飞…… 但~你们是否有过这种经历? 庚子年四月初一 路人甲小手一抖,不小心把配置删了,然后只能重新配置,再然后发现鬼记得太古时代都做了哪些配置…...
纯FPGA实现AD9361控制的思路和实现 UART实现AXI_MASTER
这里用一个串口接收PC机传过来的读写寄存器的控制指令,对地址地址的AXI_sLAVE进行读写后返回其结果。 串口收发器用的代码还是经典的FPGA4FUN上的。fpga4fun.com - Serial interface (RS-232) 我做了极小修改,直接贴出来代码: // RS-232 RX…...
计算机网络期中复习笔记(自用)
复习大纲 –第一章 概述 计算机网络的组成 网络边缘:主机和网络应用程序(又称为“端系统”) 端系统中运行的程序之间的通信方式可划分为两大类: 客户/服务器方式(C/S方式) 对等方式(P2P方式…...
MFC文件-屏幕录像
下载本文件 本文件将获取屏幕图像数据的所有代码整合到两个文件中(ScreenRecorder.h和ScreenRecorder.cpp),使获取屏幕图像数据变得简单。输出IYUV视频流。还可以获取系统播放的声音,输出PCM音频流。由于使用了MFC类,本…...
JAVA的泛型
为什么引入泛型 有两个作用: 适用于多种数据类型执行相同的代码(代码复用)泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)消除强制类型转换兼容性与类型擦除更灵活…...
【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
从 HBuilderX 4.56 ,vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意: sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…...
【sylar-webserver】8 HOOK模块
文章目录 知识点HOOK实现方式非侵入式hook侵入式hook ⭐⭐⭐ 覆盖系统调用接口获取被全局符号介入机制覆盖的系统调用接口 具体实现 在写之前模块的时候,我一直在困惑 协程是如何高效工作的,毕竟协程阻塞线程也就阻塞了。 HOOK模块解开了我的困惑。&…...
【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 判断是不是平衡二叉树(递归)最大子矩阵(二维前缀和)小葱的01串(滑动窗口) 判断是不是平衡二叉树(递归) 判断是不是平衡二叉…...
交易系统的构建与实战法则
Ⅰ 交易哲学:理解市场本质 时间的艺术:鳄鱼法则的启示80%的交易时间应用于观察和等待日均有效交易机会不超过3次(以A股为例)杰西利弗莫尔的棉花合约案例(1907年等待11周)波动率与交易频率的黄金分割比例Ⅱ 形态识别系统:双轨交易模型 A. 趋势引擎 三级趋势验证体系: 均…...
C++高并发内存池ConcurrenMemoPool
一、介绍高并发内存池 本项目的原型是Google的开源项目tcmalloc,即线程缓存的malloc,相较于系统的内存分配函数malloc,free,本项目能达到高效的多线程内存管理 旨在学习其核心框架,借鉴其实现方式来模拟实现出一个我们…...
ubuntu下gcc/g++安装及不同版本切换
1. 查看当前gcc版本 $ gcc --version# 查看当前系统中已安装版本 $ ls /usr/bin/gcc*2. 安装新版本gcc $ sudo apt-get update# 这里以版本12为依据(也可以通过源码方式安装,请自行Google!) $ sudo apt-get install -y gcc-12 g…...
React-在使用map循环数组渲染列表时须指定唯一且稳定值的key
在渲染列表的时候,我们须给组件或者元素分配一个唯一值的key, key是一个特殊的属性,不会最终加在元素上面,也无法通过props.key来获取,仅在react内部使用。react中的key本质是服务于diff算法, 它的默认值是null, 在diff算法过程中…...
(03)Vue的常用指令
文章目录 第3章 Vue的常用指令3.1 v-text与v-html3.2 v-for3.3 v-if与v-show3.4 MVVM双向绑定3.4.1 v-bind3.4.2 v-model 第3章 Vue的常用指令 3.1 v-text与v-html v-text:不会渲染字符串里面的HTML内容v-html:会渲染字符串里面的HTML内容 <body s…...
从代码学习深度学习 - 优化算法 PyTorch 版
文章目录 前言一、小批量梯度下降(Mini-batch Gradient Descent)1.1 公式1.2 PyTorch 实现二、动量法(Momentum)2.1 公式2.2 PyTorch 实现三、AdaGrad 算法3.1 公式3.2 PyTorch 实现四、RMSProp 算法4.1 公式4.2 PyTorch 实现五、Adadelta 算法5.1 公式5.2 PyTorch 实现六、…...
JAVA设计模式——(1)适配器模式
JAVA设计模式——(1)适配器模式 目的理解实现优势 目的 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。 理解 可以想象成一个国标的插头,结果插座是德标的&…...
深入Docker核心技术:从Namespace到容器逃逸防御
深入Docker核心技术:从Namespace到容器逃逸防御 引言:容器技术的本质突破 Docker作为容器技术的代表,其革命性不仅在于轻量级虚拟化,更在于重新定义了应用交付的标准范式。本文将穿透表象,深入剖析Docker的核心技术实…...
面向对象设计中的类的分类:实体类、控制类和边界类
目录 前言1. 实体类(Entity Class)1.1 定义和作用1.2 实体类的特点1.3 实体类的示例 2. 控制类(Control Class)2.1 定义和作用2.2 控制类的特点2.3 控制类的示例 3. 边界类(Boundary Class)3.1 定义和作用3…...
【MySQL】004.MySQL数据类型
文章目录 1. 数据类型分类2. 数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float2.3.2 decimal 2.4 字符串类型2.4.1 char2.4.2 varchar2.4.3 char和varchar比较 2.5 日期和时间类型2.6 enum和set2.7 enum和set类型查找 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 …...
使用docker在manjaro linux系统上运行windows和ubuntu
因为最近项目必须要使用指定版本的solidworks和maxwell(都只能在win系统上使用), 且目前的ubuntu容器是没有桌面的,导致我运行不了一些带图形的ros2功能。无奈之下,决定使用docker-compose写一下配置文件,彻底解决问题…...
Flask应用部署通用指南
IIS 部署 Python Flask 应用通用指南 目录 概述环境准备应用准备wfastcgi 配置IIS 网站配置权限配置静态文件处理安全配置性能优化常见问题与解决方案生产环境最佳实践 概述 将 Flask 应用部署到 Windows IIS 服务器上需要使用 WSGI 适配器(如 wfastcgi…...
数据驱动增长:大数据与营销自动化的结合之道
数据驱动增长:大数据与营销自动化的结合之道 在这个信息爆炸的时代,企业如果还靠拍脑袋做营销决策,那基本等同于闭着眼睛开车,撞上南墙只是时间问题。大数据和营销自动化的结合,让营销从传统的经验主义走向科学决策&a…...
[Java微服务组件]注册中心P3-Nacos中的设计模式1-观察者模式
在P1-简单注册中心实现和P2-Nacos解析中,我们分别实现了简单的注册中心并总结了Nacos的一些设计。 本篇继续看Nacos源码,了解一下Nacos中的设计模式。 目录 Nacos 观察者模式 Observer Pattern观察者模式总结 Nacos 观察者模式 Observer Pattern 模式定…...
Java—— 常见API介绍 第二期
Runtime 说明: Runtime表示当前虚拟机的运行环境 获取Runtime对象的方法是静态的,可以用类名调用 不能用new关键字创建Runtime对象,只能调用获取Runtime对象的方法获取对象 其他的方法不是静态的,不能直接用类名调用,…...
意志力的源头——AMCC(前部中扣带皮层)
AMCC(前部中扣带皮层)在面对痛苦需要坚持的事情时会被激活。它的存在能够使人类个体在面临困难的事、本能感到不愿意的麻烦事情时,能够自愿地去做这些事——这些事必须是局部痛苦或宏观的痛苦,即微小的痛苦micro-sucks。 AMCC更多…...
ProfiNet转DeviceNet边缘计算网关多品牌集成实践:污水处理厂设备网络融合全流程解析
一、行业背景 随着环保政策趋严,污水处理行业对自动化、数据实时性和设备兼容性需求激增。传统污水处理厂普遍存在设备协议异构(如DeviceNet、ProfiNet混用)、数据孤岛严重的问题,现需通过捷米特DeviceNet转ProfiNet协议转换网关…...
CCLinkIE转EtherCAT边缘计算网关构建智能产线:跨协议设备动态组网与数据优化传输
一、行业背景 随着新能源汽车市场爆发式增长,汽车制造企业对产线效率、设备协同性及柔性生产能力的要求显著提升。传统产线多采用CC-LinkIEFieldBasic(CCLINKIEFB)协议的三菱PLC控制系统,而新一代伺服驱动设备普遍采用EtherCAT协…...
C 语言中的高级数据结构与内存管理
一、引言 C 语言作为一种广泛应用的系统级编程语言,以其高效性和灵活性著称。在 C 语言编程中,高级数据结构和内存管理是两个至关重要的方面。高级数据结构能够帮助我们更高效地组织和处理数据,而合理的内存管理则是保证程序性能和稳定性的关…...
Django 实现服务器主动给客户端发送消息的几种常见方式及其区别
Django Channels 原理 :Django Channels 是 Django 的一个扩展,它通过使用 WebSockets 等协议来处理长连接,使服务器能够与客户端建立持久连接,从而实现双向通信。一旦连接建立,服务器可以随时主动向客户端发送消息。…...
BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])
目录 一、规范要求 1、协议章节 2、测试目的 二、测试方法 1、样机初值条件: 2、测试步骤: 方法一:频谱仪 方法二:综测仪CMW500 3、预期结果 一、规范要求 1、协议章节 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…...
rabbitmq 面试题
一、基础概念 1. 什么是 RabbitMQ? - 基于 AMQP 协议的开源消息中间件,用于实现系统间的异步通信和解耦,支持多种消息模式(如发布/订阅、路由、主题等)。 1. 你了解那个rabbitmq, rabbitmq 的 虚拟机是…...
论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/chat/3367091682540290 速览 研究动机…...
spring事务事务传播
POROPAGATION_REQUIRED(必须) 解释: 存在事务时 当前方法已在事务中运行,直接加入该事务 无事务 则自动开启一个新事物,并在方法执行结束后提交或者回滚 举例 java Transactional public void transfer() {accountService.reduceBalance…...
JMeter介绍
文章目录 1. JMeter简介2. JMeter 下载3. JMeter修改编码集4. 启动并运行JMeter 1. JMeter简介 JMeter 是 Apache 组织使用 Java 开发的一款测试工具: 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序是否能返回期望的结果 优…...
Elasticsearch:使用 ES|QL 进行搜索和过滤
本教程展示了 ES|QL 语法的示例。请参考 Query DSL 版本,以获得等效的 Query DSL 语法示例。 这是一个使用 ES|QL 进行全文搜索和语义搜索基础知识的实践介绍。 有关 ES|QL 中所有搜索功能的概述,请参考《使用 ES|QL 进行搜索》。 在这个场景中&#x…...
面向新一代扩展现实(XR)应用的物联网框架
中文标题: 面向新一代扩展现实(XR)应用的物联网框架 英文标题: Towards an IoT Framework for the New Generation of XR Applications 作者信息 Joo A. Dias,UNIDCOM - IADE,欧洲大学,里斯本&…...
Docker Overlay 网络的核心工作(以跨节点容器通信为例)
Docker 的 overlay 网络是一种基于 VXLAN(Virtual Extensible LAN)的多主机网络模式,专为 Docker Swarm 集群设计,用于实现跨节点的容器通信。它通过虚拟二层网络,允许容器在不同主机上像在同一局域网内一样通信。Dock…...
开发基于python的商品推荐系统,前端框架和后端框架的选择比较
开发一个基于Python的商品推荐系统时,前端和后端框架的选择需要综合考虑项目需求、开发效率、团队熟悉度以及系统的可扩展性等因素。 以下是一些推荐的框架和建议: 后端框架 Flask 优点: 轻量级:Flask的核心非常简洁,…...
CSRF 请求伪造Referer 同源置空配合 XSSToken 值校验复用删除
#CSRF- 无检测防护 - 检测 & 生成 & 利用(那数据包怎么整 找相似源码自己搭建整) 检测:黑盒手工利用测试,白盒看代码检验(有无 token ,来源检验等) 生成: BurpSuite->Engagement t…...