【云备份】学习Json

news2025/1/12 18:03:48

文章目录

  • 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.h

class 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;                           // 转 float
    bool 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对象写到buffer
    std::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.coloradmin.cn/o/2040065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2024-38077 Windows远程桌面授权服务漏洞介绍

CVE-2024-38077 是一个在Windows远程桌面授权服务&#xff08;Remote Desktop Licensing Service&#xff09;中存在的严重远程代码执行漏洞。以下是关于此漏洞的详细信息&#xff1a; 漏洞概述 漏洞编号&#xff1a;CVE-2024-38077漏洞类型&#xff1a;远程代码执行 (RCE)影…

基于单片机控制的多功能智能语音风扇

【摘要】 本文简述了一种基于单片机控制的智能多功能语音风扇的设计&#xff0c;该设计以STC11L08XE单片机为主控制器&#xff0c;通过YS-LDV7语音模块对语音信号进行采集识别&#xff0c;并将该信号上传给单片机进而控制风扇的转速和开关&#xff0c;以达到语音控制的效果。该…

Python 安装 PyTorch详细教程

本章教程,介绍如何安装PyTorch,介绍两种安装方式,一种是通过pip直接安装,一种是通过conda方式安装。 一、查看CUDA版本 二、安装PyTorch 1、pip安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1162、conda安装方式 …

Leetcode—3151. 特殊数组 I【简单】

2024每日刷题&#xff08;155&#xff09; Leetcode—3151. 特殊数组 I 实现代码 class Solution { public:bool isArraySpecial(vector<int>& nums) {int n nums.size();for(int i 1; i < n; i) {if(nums[i - 1] % 2 nums[i] % 2) {return false;}}return t…

【数据结构-前缀哈希】力扣1124. 表现良好的最长时间段

给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这段时间内&#xff0c;「劳累的天数」是严格 大…

练习实践-基础设施-文件共享-linux间的文件共享-NFS服务搭建

参考来源&#xff1a; nfs安装配置-Debian/Ubuntu 什么是NFS&#xff1f;NFS挂载 NFS详解&#xff08;概念实验演示&#xff09; 快速回顾&#xff1a; nfs服务器搭建&#xff1a;1>.服务器端&#xff1a;1&#xff09;创建共享目录2&#xff09;修改配置文件/etc/exports…

深入解析三路快排:一种高效的排序算法

在数据结构和算法的世界中&#xff0c;快排&#xff08;Quick Sort&#xff09;无疑是最受欢迎的排序算法之一。今天&#xff0c;探讨一种优化的快排变体——三路快排&#xff08;3-Way Quick Sort&#xff09;&#xff0c;它在处理具有重复元素的数组时展现出了令人惊叹的效率…

PCIe学习笔记(22)

Transaction Ordering Transaction Ordering Rules 表2-40定义了PCI Express Transactions的排序要求。该表中定义的规则统一适用于PCI Express上所有类型的事务&#xff0c;包括内存、I/O、配置和消息。该表中定义的排序规则适用于单个流量类(TC)。不同TC标签的事务之间没有…

Label-Wise Graph Convolutional Network for Heterophilic Graphs

推荐指数: #paper/⭐⭐ 发表于:LoG 2022 推荐指数是因为22年,所以给2行. 贡献:用MLP来区分不同的标签信息. 思想阐述: 假设 N k ( v ) \mathcal{N}_{k}(v) Nk​(v)表示节点v标签为k的邻居.我们定义基于 a v , k a_{v,k} av,k​为聚合标签为k的邻居:(即只聚合标签为k的邻居) a…

拒绝内卷:利用4P营销理论打造汇报PPT

在当下的职场文化里&#xff0c;越来越激烈的“内卷”现象普遍存在。随着不得已的竞争压力、加班文化、以及技能和学历的通货膨胀&#xff0c;越来越多职场人不惜加大工作负荷和劳动投入。但这种过度的付出往往并未带来成比例的回报&#xff0c;有时还会因为过度工作而导致生产…

Oracle Java JDK 21 下载地址及安装教程

Oracle JDK 21 官方地址 https://www.oracle.com/java/technologies/downloads/#java21 1. Linux 版本 ARM64 Compressed Archive https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz ARM64 RPM Package https://download.oracle.com/java/21/late…

OpenHarmony网络协议通信—nanopb

简介 nanopb是一种小代码量的协议缓冲区实现&#xff0c;适用于任何内存受限的系统。 下载安装 直接在OpenHarmony-SIG仓中搜索nanopb并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的Nanopb库代码存在以下路径&#xff1a;./third_party/nanopb 修改添…

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道&#xff1a;上周8月5日&#xff0c;美国法院裁定谷歌的搜索业务违反了美国反垄断法&#xff0c;非法垄断在线搜索和搜索文本广告市场。据悉&#xff0c;胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据&#xff0c;以及防止其在人工智…

C# Log4net日志 配置 与AppenderSkeleton

https://www.cnblogs.com/yaopengfei/p/9428206.html 一、Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架&#xff0c;它的功能很强大&#xff0c;可以将日志分为不同的等级&#xff0c;以不同的格式输出到不同的存储介质中&#xff0c;比如&#x…

Vue框架学习笔记-6

Vue中的路由 Vue中的路由&#xff08;Routing&#xff09;是通过Vue Router这个官方提供的路由管理器来实现的。Vue Router允许你通过不同的URL访问应用中不同的页面&#xff08;组件&#xff09;&#xff0c;而无需重新加载页面。这对于构建单页应用&#xff08;SPA, Single …

数字引领风尚·智能改变生活“青岛电博会”路演活动(济南站)

2024CICE中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;成功举行 数字引领风尚&#xff0c;智能改变生活。 8月7日&#xff0c;50余家行业协会、企业嘉宾、展商代表等云集2024中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;现场&#xff0c;共…

【香菇带你学Mysql】Linux下Mysql8使用二进制安装包安装教程【建议收藏】

⚠️ 本人声明&#xff1a;本教程可100%复现​ 网上看了很多Mysql8安装的方式&#xff0c;基本上都是都过一个yum方式直接访问公网下载依赖资源安装的。 但是在企业内部一般并不允许生产环境直接连接公网。针对此情况。本文将介绍如何在内网环境下使用二进制安装包本地安装方式…

【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁

文章目录 乐观锁和悲观锁重量级锁和轻量级锁挂起等待锁和自旋锁公平锁和非公平锁可重入锁和不可重入锁读写锁相关面试题 锁&#xff1a;非常广义的概念&#xff0c;不是指某个具体的锁&#xff0c;所有的锁都可以往这些策略中套 synchronized&#xff1a;只是市面上五花八门的锁…

新形势下职业教育云计算人才培养策略

一、引言 在数字化转型的浪潮中&#xff0c;云计算作为核心技术之一&#xff0c;正在深刻影响着各行各业的发展。职业教育作为培养技术技能型人才的重要途径&#xff0c;需要紧跟时代步伐&#xff0c;不断优化和创新云计算人才培养模式&#xff0c;以满足社会对云计算人才的迫…

基于MyBatis-plus的SpringBoot开发

目录 一、SpringBoot整合mybatis 二、SpringBoot整合mybatis-plus 1、什么是mybatis-plus&#xff1f; 2、mybatis-plus的特性 3、mybatis-plus的使用 &#xff08;1&#xff09;编写注解配置实体类与关系表映射关系 &#xff08;2&#xff09;mapper层 &#xff08;3…