【云备份】学习Json

文章目录

  • 1.Json数据类型
    • 基础数据类型
    • 复合数据类型
    • JSON数据类型的应用
  • 2.学习jsoncpp库
    • 利用json实现序列化
    • 利用json实现反序列化

1.Json数据类型

json 是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。json数据交换格式是将多种数据对象组织成为⼀个字符串。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它支持多种数据类型,包括字符串、数字、布尔值、空值、对象和数组。

基础数据类型

JSON支持四种基础数据类型:字符串" "(string)、数字(整形/浮点型)(number)、布尔型(boolean)和空值(null)。
字符串必须用双引号括起来,数字可以是整数或浮点数,布尔型表示为true或false,而空值则表示为null。

复合数据类型

JSON还支持两种复合数据类型:对象(object)和数组(array)。
对象是由花括号{}包围的键值对集合,其中键是字符串,值可以是任何JSON支持的数据类型
数组是由方括号[]包围的值的有序列表,数组中的每个值可以是任何JSON支持的数据类型

JSON数据类型的应用

在实际应用中,JSON数据类型广泛用于数据存储和交换。例如,在MySQL数据库中,从5.7版本开始支持JSON数据类型,允许直接在数据库中存储和操作JSON格式的数据。这种支持极大地增强了数据库处理非结构化数据的能力。

2.学习jsoncpp库

jsoncpp 库用于实现 json 格式的序列化和反序列化,完成将多个数据对象组织成为 json 格式字符串,以及将json 格式字符串解析得到多个数据对象的功能。
这其中主要借助三个类以及其对应的少量成员函数完成:

// Json数据对象类
// typedef unsigned int Json::ArrayIndex value.hclass Json::Value
{// Value重载了 [] 和 = 赋值/获取数据可以通过简单的⽅式完成Value &operator=(const Value &other);Value &operator[](const std::string &key); // val["姓名"] = "⼩明Value &operator[](const char *key);Value removeMember(const char *key);             // 移除元素const Value &operator[](ArrayIndex index) const; // val["成绩"][0]Value &append(const Value &value);               // 添加数组元素     val["成绩"].append(88);ArrayIndex size() const;                         // 获取数组元素个数 val["成绩"].size();std::string asString() const;                    // 转string        val["name"].asString();const char *asCString() const;                   // 转char*         val["name"].asCString();Int asInt() const;                               // 转 int          val["age"].asInt();float asFloat() const;                           // 转 floatbool asBool() const;                             // 转 bool
};// json序列化类 低版本⽤
class JSON_API Writer
{virtual std::string write(const Value &root) = 0;
};
class JSON_API FastWriter : public Writer
{virtual std::string write(const Value &root);
};
class JSON_API StyledWriter : public Writer
{virtual std::string write(const Value &root);
};// json序列化类 ⾼版本推荐 ⽤低版本的接⼝可能会有警告
class JSON_API StreamWriter
{virtual int write(Value const &root, std::ostream *sout) = 0;
};
class JSON_API StreamWriterBuilder : public StreamWriter::Factory
{virtual StreamWriter *newStreamWriter() const;
};// json反序列化类 低版本⽤
class JSON_API Reader
{bool parse(const std::string &document, Value &root, bool collectComments = true);
};// json反序列化类 ⾼版本更推荐
class JSON_API CharReader
{virtual bool parse(char const *beginDoc, char const *endDoc, Value *root, std::string *errs) = 0;
};
class JSON_API CharReaderBuilder : public CharReader::Factory
{virtual CharReader *newCharReader() const;
}

利用json实现序列化

#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>
//g++ jsonSerialize.cc  -o jsonSerialize -ljsoncpp -std=c++11 
int main()
{//结构化数据 -- json数据 -- 字符串数据const char *name = "小明 ";int age = 18;float score[] = {77.5, 88, 93.6};//1.将所有的数据保存在Json::Value对象中Json::Value root;root["姓名"] = name;root["年龄"] = age;root["成绩"].append(score[0]);root["成绩"].append(score[1]);root["成绩"].append(score[2]);//2. 将json对象序列化成字符串Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> swPtr(swb.newStreamWriter());std::stringstream ss;swPtr->write(root, &ss);//json对象写到bufferstd::cout << ss.str() << std::endl;return 0;
}

在这里插入图片描述

利用json实现反序列化

#include <iostream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>
//g++ jsonParse.cc -o jsonParse -l jsoncpp
// 将字符串反序列化为json对象
int main()
{// R: 表示之后皆为原始字符串//(const char [54]) "{\"姓名\":\"小黑\",\"年龄\":19,\"成绩\":[58.5,56,59]}"std::string str = R"({"姓名":"小黑","年龄":19,"成绩":[58.5,56,59]})";Json::Value root;Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> crPtr(crb.newCharReader());//从strbuf读到json//bool parse(const char *beginDoc, const char *endDoc, Value *root, string *errs)std::string err;//从一个字符序列中解析存储在Value对象中 将错误信息存储在string类型的对象中bool parseOk = crPtr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);if (parseOk == false){std::cout << "parse error: " << err << std::endl;return -1;}std::cout << root["姓名"].asString() << std::endl;std::cout << root["年龄"].asInt() << std::endl;for (int i = 0; i < root["成绩"].size(); i++)std::cout << root["成绩"][i] << std::endl;return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中lsqr函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 lsqr 提供初始估计值 使用函数句柄代替数值矩阵 lsqr函数的功能是求解线性系统 - 最小二乘法。 语法 x lsqr(A,b) x lsqr(A,b,tol) x lsqr(A,b,tol,maxit) x lsqr(A,b,tol,maxit,M) x lsqr(A,b,tol,m…

【Qt】QWidget的windowIcon属性

QWidget的windowIcon属性 windowIcon表示窗口的图标 当我们使用默认的windowIcon的时候&#xff0c;其窗口的图标如下&#xff1a; API说明 windowIcon() 获取到控件的窗⼝图标. 返回 QIcon 对象. setWindowIcon(const QIcon& icon) 设置控件的窗⼝图标. 在Qt中&…

【STM32 FreeRTOS】任务

使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行&#xff0c;不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点&#xff0c;应用程序中只能执行一个任务&#xff0c;实时 RTOS 调度器负责决定所要执行的任务。因此&#xff0c; R…

react中使用nextjs框架,前端调后端接口跨域解决方式

前端在项目目录中next.config.js文件中添加以下代码 async rewrites() {return [{source: "/api/:path*",destination: ${process.env.NEXT_PUBLIC_API_DOMAIN}/api/:path*,basePath: false}]} 截图&#xff1a; source: "/api/:path*": 定义了一个 URL …

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

【MySQL 03】库的操作 (带思维导图)

文章目录 &#x1f308; 一、创建数据库&#x1f308; 二、查看数据库&#x1f308; 三、使用数据库&#x1f308; 四、修改数据库&#x1f308; 五、删除数据库&#x1f308; 六、备份数据库&#x1f308; 七、恢复数据库&#x1f308; 八、字符集和校验规则⭐ 1. 查看系统默认…

HAProxy 效能飞跃先锋队

目录 一 负载均衡 1.1 四层负载 1.2 七层负载 1.3 四层负载和七层负载的区别 二 Haproxy简介 2.1 概念和内容 2.2 haproxy的基本配置信息 2.2.1 global 配置 2.2.2 proxies 配置 三 Haproxy的算法 3.1 静态算法 3.2 动态算法 3.3 其他算法 四 高级功能及配置 4.…

Mysql原理与调优-索引原理及使用

目录 1.绪论 2.索引原理 2.1 索引采用的数据结构 2.1.1 B树 1.什么是B树 2.B树的优缺点 2.1.2 B树 1.什么是B树 3.B树的优缺点 2.2.3 hash 2.2.4 总结 2.2 InnoDB数据存储结构(聚簇索引) 2.2.1 自底向上探寻索引 3.2.2 查询一条数据的完整流程 3.2.3 聚簇索引 2…

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?

作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满&#xff0c;几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代&#xff0c;AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现&#xff0c;同样值得业界关注&…

haproxy最强攻略

1、负载均衡 负载均衡&#xff08;Load Balance&#xff0c;简称 LB&#xff09;是高并发、高可用系统必不可少的关键组件&#xff0c;目标是 尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用如下&#xff1a; 高并发…

# Spring Cloud Alibaba Nacos_配置中心与服务发现(四)

Spring Cloud Alibaba Nacos_配置中心与服务发现&#xff08;四&#xff09; 一、Nacos 配置管理-集群部署 1、 把 nacos 应用程序包&#xff0c;复制3份&#xff0c;分别命名为 nacos1, nacos2, nacos3 分别在 conf 目录下&#xff0c;修改 application.properties 配置文件…

数据结构——循环队列

目录 循环队列的基本知识 循环队列的实现 定义 各个接口的实现 循环队列的基本知识 循环队列的定义 循环队列&#xff08;Circular Queue&#xff09;是一种使用固定大小的数组实现的队列&#xff0c;它将数组的首尾相连&#xff0c;形成环形&#xff0c;以充分利用空间并实…

Spring Boot的配置文件

目录 一、配置文件 1.properties为后缀的配置文件 1.1基本语法 1.2读取配置文件 1.3properties的优缺点 1.4加中文注释出现乱码 2.yml格式的配置文件 2.1基础语法 2.2读取配置文件 2.2.1对象存储到配置文件中 2.3yml的优缺点 2.4用不用加单引号或者双引号呢&#xf…

【C语言篇】编译和链接以及预处理介绍(上篇)

文章目录 前言翻译环境和运行环境翻译环境编译预处理&#xff08;预编译&#xff09;编译词法分析语法分析语义分析 汇编 链接 运行环境预处理&#xff08;预编译&#xff09;详解预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏和函数的对比 写在最后…

opencv基础的图像操作

1.读取图像&#xff0c;显示图像&#xff0c;保存图像 #图像读取、显示与保存 import numpy as np import cv2 imgcv2.imread(./src/1.jpg) #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让…

RAG系列之四:深入浅出 Embedding

在 RAG 系列之三&#xff1a;文本切分中介绍了如何将文本切分成更小的语义单元&#xff0c;接下来便是将拆分的文本块进行向量化。 什么是文本向量化&#xff1f; 文本向量化就是将文本数据转成数字数据&#xff0c;例如&#xff1a;将文本 It was the best of times, it was…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论&#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么&#xff1a;activity是什么时候被创建的&…

Python数据可视化案例——地图

目录 简单案例&#xff1a; 进阶案例&#xff1a; 继上文数据可视化案例&#xff0c;今天学习用pyecharts练习数据可视化案例2-构建地图。 简单案例&#xff1a; 首先构建一个简单的地图。 代码&#xff1a; import json from pyecharts.charts import MapmapMap() data[…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

大数据面试SQL(八):求连续段的起始位置和结束位置

文章目录 求连续段的起始位置和结束位置 一、题目 二、分析 三、SQL实战 四、样例数据参考 求连续段的起始位置和结束位置 一、题目 有一张表t2_id记录了id&#xff0c;id不重复&#xff0c;但是会存在间断&#xff0c;求出连续段的起始位置和结束位置。 样例数据&…