json库——jsoncpp

news2024/11/25 20:42:54

一、jsoncpp简介

JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object
Notation)数据格式。JSON是一种轻量级的数据交换格式,广泛用于各种应用程序和网络服务中。

JsonCpp提供了简单和易用的API,可以方便地解析JSON字符串并将其转换为C++对象,同时也可以将C++对象序列化为JSON字符串。它支持标准的JSON语法,并提供了许多功能,如访问和修改JSON对象的属性、数组操作、遍历等。

JsonCpp库的主要特点包括:

轻量级:JsonCpp具有很小的代码体积和低的内存占用,因此非常适合嵌入式系统或资源受限的环境。

跨平台:JsonCpp可以在多种操作系统上运行,包括Windows、Linux、Mac等。

简单易用:JsonCpp提供了简洁的API,使得解析和生成JSON数据变得非常容易。开发人员可以通过简单的函数调用来实现JSON数据的读取、修改和生成。

高性能:JsonCpp采用了高效的算法和数据结构,提供了快速的JSON解析和生成功能。

可靠稳定:JsonCpp经过广泛的测试和使用,已经成为一个成熟的库。它具有良好的稳定性和可靠性,可以处理各种复杂的JSON数据结构

二、下载源码

https://github.com/open-source-parsers/jsoncpp
首先阅读下面的README.md,主要看这句、合并源,我们可以点击这个链接进去
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated- (Possibly-outdated)

Amalgamated source
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated-(Possibly-outdated)

阅读一下这段话,也可以翻译一下
在这里插入图片描述

将JsonCpp集成到您的项目中的一种方法是将汇总的源代码(一个.cpp文件和两个.h文件)包含在您的项目中,并像编译和构建其他源文件一样进行编译和构建。这样可以确保编译标志的一致性和ABI兼容性,这些问题在构建共享库或静态库时会出现。下面的部分提供了详细的说明。

将include/目录添加到您的编译器包含路径中。您可以按照以下方式包含JsonCpp头文件:

#include <json/json.h>

如果在Windows上将JsonCpp构建为动态库,则项目需要定义宏JSON_DLL。

生成汇总的源代码和头文件JsonCpp提供了一个脚本用于生成单个头文件和单个源文件,以便于包含到现有项目中。可以通过从顶层目录运行以下命令随时生成汇总的源代码(需要Python3.4+):

 python amalgamate.py

您可以指定头文件名。有关详细信息,请参阅-h选项。

默认情况下,将生成以下文件:

dist/jsoncpp.cpp:需要添加到您的项目中的源文件。
dist/json/json.h:用于在项目中使用的相应头文件。与在非汇总源代码中包含json/json.h相当。此头文件仅依赖于标准头文件。
dist/json/json-forwards.h:提供所有JsonCpp类型的前向声明的头文件。汇总的源代码是通过按正确的顺序连接JsonCpp源代码并定义宏JSON_IS_AMALGAMATION来生成的,以防止包含其他头文件。

大概意思就是如果我们要是jsonCpp的库,实际上就是需要将jsoncpp.cpp,json.h,json-forwards.h添加到我们的项目当中。
那我们怎么样获得这三个文件?

在这里插入图片描述

下载后找到下面文件
在这里插入图片描述
在当前目录下打开终端,执行下面的命令

python amalgamate.py

在这里插入图片描述
你就可以在当前目录下找到dist目录,里面就有我们需要的三个文件
在这里插入图片描述
我们终于可以使用它了

三、具体应用

Json格式简介

JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:

可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。

简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。

支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。

易于解析和生成:JSON数据可以轻松地由各种编程语言解析和生成。许多编程语言都提供了内置的JSON解析器和生成器,使得处理JSON数据变得简单和方便。

跨平台和语言无关:由于JSON是一种通用的数据格式,它不依赖于任何特定的平台或编程语言。这意味着JSON可以在不同的系统和不同的编程语言之间进行数据交换和共享。

可扩展性:JSON支持嵌套结构,允许在对象中嵌套其他对象或数组,从而实现复杂的数据结构。这种嵌套结构可以实现数据的层级关系和组织。

平台无关的数据交换格式:由于JSON的广泛支持和普及性,它已成为一种通用的数据交换格式。许多Web服务和API都使用JSON作为数据交换的标准格式。

基本示例

{
  "name": "John",
  "age": 18,
  "isStudent": true,
  "hobbies": ["runing", "traveling"],
  "address": {
    "street": "999 Main St",
    "city": "hangzhou"
  }
}

上述示例表示一个包含个人信息的JSON对象。它包括名称、年龄、是否是学生、兴趣爱好和地址等属性。注意JSON中使用双引号表示键和字符串值,使用逗号分隔不同的键值对,使用方括号表示数组,使用花括号表示对象

基本语法:

①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。

json2str

std::string json2str(const Json::Value &v, bool needFormat)
{
    if (needFormat)
    {
        Json::StreamWriterBuilder writer;
        std::string jsonString = Json::writeString(writer, v);
        return jsonString;
    }
    else
    {
        Json::FastWriter fastWriter;
        return fastWriter.write(v);
    }
}

str2json

bool str2json(const std::string &str, Json::Value &v)
{
    Json::CharReaderBuilder readerBuilder;
    std::istringstream iss(str);

    std::string errs;
    bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &v, &errs);
    if (!parsingSuccessful)
    {
        std::cout << "Failed to parse JSON: " << errs << std::endl;
        return false;
    }

    return true;
}

str2file

bool str2file(const std::string &path, const std::string &data)
{
    std::ofstream file(path);
    if (!file.is_open())
    {
        return false;
    }

    file << data;
    file.close();

    return true;
}

file2json

bool file2json(const std::string &file, Json::Value &v)
{
    std::ifstream inputFile(file);
    if (!inputFile.is_open())
    {
        std::cout << "Failed to open file: " << file << std::endl;
        return false;
    }

    Json::CharReaderBuilder readerBuilder;
    std::string errs;

    bool parsingSuccessful = Json::parseFromStream(readerBuilder, inputFile, &v, &errs);
    inputFile.close();

    if (!parsingSuccessful)
    {
        std::cout << "Failed to parse JSON: " << errs << std::endl;
        return false;
    }

    return true;
}

main

int main()
{
    // 创建一个Json::Value对象
    Json::Value root;
    Json::Value rootaddress;

    // 添加数据到Json对象
    root["name"] = "xiaolan";              // 字符串
    root["age"] = 18;                      // 数字
    root["isStudent"] = true;              // bool类型
    Json::Value hobbies(Json::arrayValue); // 创建包含兴趣爱好的 JSON 数组
    hobbies.append("running");
    hobbies.append("traveling");
    root["hobbies"] = hobbies;

    Json::Value address; // 创建嵌套的 JSON 对象
    address["street"] = "321 Main St";
    address["city"] = "hangzhou";
    root["address"] = address;
    std::cout << "root: " << root << std::endl;

    // 生成 JSON 字符串
    std::string jsonString = json2str(root, true); // 转换为带格式的 JSON 字符串
    std::cout << "带格式jsonString: " << jsonString << std::endl;

    jsonString = json2str(root, false); // 转换为紧凑的 JSON 字符串
    std::cout << "紧凑jsonString: " << jsonString << std::endl;

    // 字符串变为json
    std::string jsonString1 = "{\"address\":{\"city\":\"hangzhou\",\"street\":\"999 Main St\"},\"age\":18,\"hobbies\":[\"running\",\"traveling\"],\"isStudent\":true,\"name\":\"xiaolan\"}";
    Json::Value root1;
    if (str2json(jsonString, root1))
    {
        std::cout << "root1: " << root1 << std::endl;
        // JSON 解析成功,可以访问解析后的数据
        // std::string name = root1["name"].asString();
        // int age = root1["age"].asInt();
        // bool isStudent = root1["isStudent"].asBool();
        // std::string street = root1["address"]["street"].asString();
        // std::string city = root1["address"]["city"].asString();

        // std::cout << "Name: " << name << std::endl;
        // std::cout << "Age: " << age << std::endl;
        // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;
        // std::cout << "Street: " << street << std::endl;
        // std::cout << "City: " << city << std::endl;
    }

    // 字符串写入文件
    str2file("tempfile.json", json2str(root1, true));

    // 从文件当中读出来JSON
    std::string filePath = "tempfile.json";

    Json::Value root2;

    if (file2json(filePath, root2))
    {
        std::cout << "root2: " << root2 << std::endl;
        // JSON 解析成功,可以访问解析后的数据
        // std::string name = root2["name"].asString();
        // int age = root2["age"].asInt();
        // bool isStudent = root2["isStudent"].asBool();
        // std::string street = root2["address"]["street"].asString();
        // std::string city = root2["address"]["city"].asString();

        // std::cout << "Name: " << name << std::endl;
        // std::cout << "Age: " << age << std::endl;
        // std::cout << "Is Student: " << (isStudent ? "true" : "false") << std::endl;
        // std::cout << "Street: " << street << std::endl;
        // std::cout << "City: " << city << std::endl;
    }
    return 0;
}

参考:
最新版 JsonCpp 的下载、编译、及使用

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

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

相关文章

C Primer Plus第十七章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 有些题目函数定义在书本存在&#xff…

路径规划算法:基于鸽群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鸽群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鸽群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鸽群…

Python编程面试题及答案(20例)

以下是一些常见的Python编程面试题以及它们的答案&#xff1a; 1.解释Python中的 GIL&#xff08;全局解释器锁&#xff09;是什么&#xff0c;它对多线程编程有什么影响&#xff1f; 答案&#xff1a;GIL是Python解释器中的一个机制&#xff0c;它确保在任何给定时间只有一个…

超详细Redis入门教程——Redis 主从集群(上)

前言 本文小新为大家带来 Redis 主从集群 相关知识&#xff0c;具体内容包括主从集群搭建&#xff08;包括&#xff1a;伪集群搭建与配置&#xff0c;分级管理&#xff0c;容灾冷处理&#xff09;&#xff0c;主从集群搭建&#xff08;包括&#xff1a;主从复制原理&#xff0c…

MySQL数据库从入门到精通学习第7天(表数据的增、删、改操作)

表数据的增、删、改操作 使用INSERT...VALUES语句插入数据修改数据删除数据 使用INSERT…VALUES语句插入数据 语法&#xff1a; INSERT [INTO] 数据表名[(字段名...)] VALUES ({值 | DEFAULT},...),()...; [INTO] 数据表名&#xff1a;可选项&#xff0c;用于指定被操作的数…

手把手教你rtsp流媒体分析(引导篇,欢迎订阅专栏)

系列音视频开发 文章目录 系列音视频开发前言一、RTSP是什么&#xff1f;二、RTP是什么&#xff1f;三、RTCP是什么&#xff1f;四、RTSP 源码学习五、H265 RTSP流总结 前言 在安防行业中&#xff0c;onvif协议与gb协议是两种标准&#xff0c;gb是国内安防行业的标准&#xff…

Go Web下gin框架使用(二)

〇、gin 路由 Gin是一个用于构建Web应用程序的Go语言框架&#xff0c;它具有简单、快速、灵活的特点。在Gin中&#xff0c;可以使用路由来定义URL和处理程序之间的映射关系。 r : gin.Default()// 访问 /index 这个路由// 获取信息r.GET("/index", func(c *gin.Con…

康耐视In-Sight2800相机的使用

In-Sight2800相机注册分类程序 一、登录相机 二、图像导入 IS相机支持拍摄图像和从文件中导入图像 如选择从文件中导入图像&#xff0c;文件夹选择位置在页面左下方&#xff0c;如下图 三、注册分类器 在检查模块注册分类器&#xff0c;注册图像需要一张一张去学习&#x…

儿童节到了,我用HTML和CSS画了一个小朋友

文章目录 前言一、关于HTML和CSS二、开始编码2.1 在HTML正文中配置好元素2.2 开始写各个元素的CSS2.3 效果图展示 总结 前言 官方告知我今天参加活动会得勋章&#xff0c;于是想了半天&#xff0c;总得创作一点东西&#xff0c;于是翻出来多年前的箱底技术&#xff0c;用CSSHT…

Kubernetes集群架构与组件介绍

个人博客 一、集群架构 二、主要组件 1.kubelet 该组件运行在每个Kubernetes节点上&#xff0c;用于管理节点。用来接收、处理、上报kube-apiserver组件下发的任务。 主要负责所在节点上的Pod资源对象的管理&#xff0c;例如Pod资源对象的创建、修改、监控、删除、驱逐及Pod…

内网安全:初探隧道技术

目录 防火墙必备知识 域控-防火墙组策略对象同步 域控 - 防火墙组策略不出网上线 MSF上线 CS - ICMP上线 注意&#xff1a;隧道技术是后渗透手段&#xff0c;是在已经取得权限后的手段 域控-组策略同步 防火墙必备知识 学习防火墙的目标是知道了解防火墙的一些常见配置…

ChatGPT应用助推跨境电商发展,低代码凭啥不行?!

随着互联网信息技术的不断发展&#xff0c;随之衍生的诸多产业也在蓬勃发展&#xff0c;而跨境电商就是互联网信息技术发展下的典型产物。 如何定义&#xff1f; 跨境电商指的是通过互联网销售商品或服务&#xff0c;跨越国家或地区边界&#xff0c;实现国际贸易的一种商业模式…

Linux 实操篇-实用指令

Linux 实操篇-实用指令 指定运行级别 基本介绍 运行级别说明&#xff1a; 0 &#xff1a;关机 1 &#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务 3&#xff1a;多用户状态有网络服务 4&#xff1a;系统未使用保留给用户 5&#xff1a;图形界…

开发移动端官网总结_Vue2.x

目录 1、自定义加载中效果 2、HTML页面注入环境变量 / 加载CDN和本地库 3、在 Vue 中使用 wow.js 4、过渡路由 5、全局监听当前设备&#xff0c;切换PC端和移动端 6、移动端常用初始化样式 7、官网默认入口文件 8、回到顶部滑动过渡效果&#xff08;显示与隐藏、滑动置…

由于找不到vcruntime140_1.dll无法继续执行此代码的三个解决方法

vcruntime140_1.dll是Microsoft Visual C Redistributable for Visual Studio的一部分&#xff0c;它是一个DLL文件&#xff0c;包含用于运行Microsoft Visual C创建的应用程序所需的Microsoft Visual C组件的代码和数据。这个DLL通常会随着应用程序安装到Windows系统中。如果这…

Dart语法学习

最近在学习flutter相关方面的知识&#xff0c;里面用到了Dart语言&#xff0c;于是写下这篇博客记录学习的一门过程。如果你有其他编程语言的经验&#xff08;尤其是Java和JavaScript&#xff09;&#xff0c;可以很快的上手Dart语言&#xff0c;Dart 在设计时应该是同时借鉴了…

Spring Cloud Alibaba - Nacos源码分析

目录 一、源码 1、为什么要分析源码 2、看源码的方法 二、Nacos服务注册与发现源码剖析 1、Nacos核心功能点 2、Nacos服务端/客户端原理 2.1、nacos-example 2.2、Nacos-Client测试类 3、项目中实例客户端注册 一、源码 1、为什么要分析源码 1. 提升技术功底&#x…

Golang内存泄露场景与定位方式

个人博客 一、产生原因 Golang有自动垃圾回收机制&#xff0c;但是仍然可能会出现内存泄漏的情况。以下是Golang内存泄漏的常见可能原因&#xff1a; 循环引用&#xff1a;如果两个或多个对象相互引用&#xff0c;且没有其他对象引用它们&#xff0c;那么它们就会被垃圾回收机…

【计算机网络实验】BGP和OSPF协议仿真实验

实验内容  BGP和OSPF协议仿真实验 实验目的 &#xff08;1&#xff09;学习BGP协议的配置方法&#xff1b; &#xff08;2&#xff09;验证BGP协议的工作原理&#xff1b; &#xff08;3&#xff09;掌握网络自治系统的划分方法&#xff1b; &#xff08;4&#xff09;验证…

3分钟快速了解—App自动化测试是怎么实现H5测试的?

移动端 app 自动化框架很多&#xff0c;但是有一些框架因为不支持混合应用测试&#xff0c;一直没有完全流行。比较典型的是经典的 Python 框架 uiautomator2, 这个框架简单好用&#xff0c;没有 appium 那样复杂的 api 调用&#xff0c;受到不少 python 自动化工程师的青睐。 …