【开源库 | jsoncpp】jsoncpp 的使用教程,附带读写json数据的例子源码

ops/2025/3/1 23:38:00/

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍jsoncpp读写json数据 🍭
⏰发布时间⏰: 2025-02-27 20:13:17

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、jsoncpp 读写数据基础知识
  • 🎄三、使用 jsoncpp 写数据
  • 🎄四、使用 jsoncpp 读数据
  • 🎄五、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易读、方便编写的特性,在各种应用中广泛使用。而对于 C++ 开发者而言,jsoncpp 库是处理 JSON 数据的得力助手。本文将深入介绍 jsoncpp,并详细讲解如何使用它进行数据的写入与读取。

JSON 以文本格式表示结构化数据,其语法简单直观,易于理解和解析。jsoncpp 则是专门为 C++ 语言打造的 JSON 库,它提供了一系列便捷的接口,让 C++ 程序能够轻松地解析 JSON 数据,生成符合 JSON 格式的内容,以及对 JSON 数据进行灵活操作。

jsoncpp 的Github地址:https://github.com/open-source-parsers/jsoncpp
jsoncpp 文档地址:http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html

如果需要了解在Linux系统中编译、交叉编译jsoncpp库的,可以参考这篇文章:libjsoncpp 的编译和交叉编译


在这里插入图片描述

jsoncpp__28">🎄二、jsoncpp 读写数据基础知识

  • JSON 数据- 名称和值
    JSON对象需要使用花括号{}包含起来。JSON对象的内容就是一条条JSON数据,JSON数据直接用逗号分隔。
    JSON 数据写为名称/值的键值对,其中名称必须使用双引号,名称后面加冒号:和值就组成一个名称/值键值对,格式如下:

    json">{ "name":value }
    
  • Json::Value 类:用来表示 json 数据的一个类。
    在写json数据时,使用下面格式可以快速生成 json 数据

    Json::Value jsonRoot; //定义根节点
    jsonRoot["intValue"] = -99;	// { "intValue":-99 }
    jsonRoot["uintValue"] = 100;// { "uintValue":100 }
    

    在读json数据时,使用下面格式可以获取到json数据中指定名称的值:

    jsonRoot["intValue"].asInt()
    jsonRoot["uintValue"].asUInt()
    
  • json 数据类型
    jsoncpp的json数据类型主要有下图7类:
    在这里插入图片描述
    其中比较特殊的是 数组类型(arrayValue)对象类型(objectValue),这两个将在下面单独介绍,其他类型写数据时都可以使用下面格式:

    Json::Value jsonRoot; //定义根节点
    jsonRoot["intValue"] = -99;	// { "intValue":-99 }
    
  • 数组类型(arrayValue)
    数组也是使用一个 Json::Value 来表示,数组类型json数据一般如下:
    一般在写入值之前需要先调用 resize(0) 来清空数组;
    数组在写入数据时,不是指定名称,而是指定下标来写数据,也可以通过 append() 方法将数据添加到数组末尾;
    数组里存放的各个元素允许是不同类型;
    可以通过下面代码来理解数组类型:

    // 数组
    Json::Value jsonArray;
    jsonArray.resize(0);	// 清空数组
    for(int i=0; i<4; i++)
    {if(i==2)jsonArray[i] = std::to_string(i);	// 数组里的值允许不同类型 2024-12-18 11:40:45elsejsonArray[i] = i;
    }
    jsonRoot["arrayValue"] = jsonArray;
    
  • 对象类型(objectValue)
    对象类型数据,就是其值是一个对象,如:

    json">{"object" : { "item", "one" }}
    

    在写入对象数据时,也是先创建 Json::Value 的子对象,再将该对象添加到指定名称的json数据中,可以参考下面代码:

    Json::Value jsonItem; //定义一个子对象
    jsonItem["item"] = "one"; //给子对象添加数据
    jsonRoot["object"] = jsonItem;
    

在这里插入图片描述

jsoncpp__92">🎄三、使用 jsoncpp 写数据

使用 jsoncpp 写数据 ,一般会用到下面这些操作:

  • 包含头文件#include <jsoncpp/json/json.h> 这行代码引入了 jsoncpp 库的核心头文件,它包含了使用 jsoncpp 所需的各种定义和函数声明。
  • 创建 JSON 对象Json::Value root; 创建了一个空的 JSON 对象root,后续可以像操作普通的键值对集合一样,向其中添加各种数据。
  • 添加键值对:通过 root["键名"] = 值; 的方式,向root对象中添加不同类型的键值对。例如,root["name"] = "John";添加了一个字符串类型的键值对,root["age"] = 30;添加了一个数字类型的键值对。
  • 创建和添加 JSON 数组:首先创建一个Json::Value类型的数组对象hobbies,并通过append方法向数组中添加元素。然后将这个数组作为一个键值对添加到root对象中,即root["hobbies"] = hobbies;
  • 转换为字符串:使用Json::StreamWriterBuilderJson::writeStringroot这个 JSON 对象转换为字符串形式,方便后续存储到文件、通过网络传输等操作。

下面是一个使用jsoncpp写数据的例子:

#include "json/json.h"
#include <iostream>int main()
{Json::Value jsonRoot; //定义根节点jsonRoot["intValue"] = -99;jsonRoot["uintValue"] = 100;jsonRoot["uint64Value"] = 0x1111111111111111;jsonRoot["realValue"] = 1.88;jsonRoot["stringValue"] = "stringValue";jsonRoot["booleanValue"] = true;// 数组Json::Value jsonArray;jsonArray.resize(0);	// 清空数组for(int i=0; i<4; i++){if(i==2)jsonArray[i] = std::to_string(i);	// 数组里的值允许不同类型 2024-12-18 11:40:45elsejsonArray[i] = i;}jsonRoot["arrayValue"] = jsonArray;// 对象数据Json::Value jsonItem; //定义一个子对象jsonItem["item"] = "one"; //添加数据jsonRoot["objectValue"] = jsonItem;// 对象数组Json::Value objectArray;objectArray.resize(0);objectArray.append(jsonItem);jsonItem.clear();jsonItem["item2"] = "two"; //添加数据objectArray[objectArray.size()] = jsonItem;jsonRoot["objectArray"] = objectArray;//	std::string strJson = jsonRoot.toStyledString(); //json结果std::cout << jsonRoot << std::endl;return 0;
}

编译:g++ mySampleWrite.cpp -I result_gcc/include/ ./result_gcc/lib/libjsoncpp.a。这里的libjsoncpp.a需要提前编译好,不会的可以看第一小节末尾推荐的文章。

运行结果:
在这里插入图片描述


在这里插入图片描述

jsoncpp__157">🎄四、使用 jsoncpp 读数据

使用 jsoncpp 写数据 ,一般会用到下面这些操作:

  • 包含头文件#include "json/json.h"
  • 定义json读取器,解析Json 数据
    Json::Reader reader;
    std::string stringJson = std::string(jsonStr);Json::Value jsonRoot; //定义根节点
    bool bRead = reader.parse( stringJson, jsonRoot );
    
    另外,也可以使用Json::parseFromStream方法将jsonString解析为Json::Value对象root。如果解析过程中出现错误,错误信息会存储在errs字符串中,通过判断解析结果可以及时发现并处理错误。
  • 读取数据:通过root["键名"].as类型()的方式从root对象中提取不同类型的数据。例如,root["name"].asString()获取字符串类型的name值,root["age"].asInt()获取数字类型的age值。
  • 读取 JSON 数组:先获取数组对应的Json::Value对象,它代表一个 JSON 数组。然后通过循环遍历数组,使用asString方法获取每个元素的值并输出。

下面是一个使用jsoncpp读数据的例子:

#include "json/json.h"
#include <iostream>char jsonStr[] = "{	\\"intValue\" : -99,		\\"uint64Value\" : 1229782938247303441,\\"uintValue\" : 100, \\"realValue\" : 1.8799999999999999,	\\"stringValue\" : \"stringValue\",		\\"booleanValue\" : true,	\\"arrayValue\" : 		\[					\0,			\1,			\\"2\",		\3			\],					\\"objectArray\" : 		\[						\{				\\"item\" : \"one\"	\},				\{				\\"item2\" : \"two\"	\}				\],						\\"objectValue\" : 		\{						\\"item\" : \"one\"	\}						\
}";int main()
{Json::Reader reader;std::string stringJson = std::string(jsonStr);Json::Value jsonRoot; //定义根节点bool bRead = reader.parse( stringJson, jsonRoot );if(!bRead){std::cout << "reader.parse error" << std::endl;return -1;}std::cout << "\"intValue\": " << jsonRoot["intValue"].asInt() << std::endl;std::cout << "\"uintValue\": " << jsonRoot["uintValue"].asUInt() << std::endl;std::cout << "\"uint64Value\": " << jsonRoot["uint64Value"].asUInt64() << std::endl;std::cout << "\"realValue\": " << jsonRoot["realValue"].asDouble() << std::endl;std::cout << "\"stringValue\": " << jsonRoot["stringValue"].asString() << std::endl;std::cout << "\"booleanValue\": " << jsonRoot["booleanValue"].asBool() << std::endl;Json::Value arrValue = jsonRoot["arrayValue"];for(int i=0; i<arrValue.size(); i++){if(i == 2)std::cout << "arrayValue-" << i << ":" << arrValue[i].asString() << std::endl;elsestd::cout << "arrayValue-" << i << ":" << arrValue[i].asInt() << std::endl;}Json::Value jsonItem = jsonRoot["objectValue"]; //定义一个子对象std::cout << "\"objectValue\": " << "\n\t" << "\"item\": " << jsonItem["item"].asString() << std::endl;Json::Value objectArray = jsonRoot["objectArray"];jsonItem.clear();jsonItem = objectArray[0];std::cout << "objectArray-item" << ":" << jsonItem["item"].asString() << std::endl;jsonItem.clear();jsonItem = objectArray[1];std::cout << "objectArray-item2" << ":" << jsonItem["item2"].asString() << std::endl;return 0;
}

编译:g++ mySampleRead.cpp -I result_gcc/include/ ./result_gcc/lib/libjsoncpp.a。libjsoncpp.a 需要提前编译好。

运行效果:
在这里插入图片描述


在这里插入图片描述

🎄五、总结

本文介绍了 jsoncpp 的一些基础使用,以及介绍怎样使用jsoncpp读写json数据,并给出了例子的代码,加深理解。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
jsoncpp使用小结


http://www.ppmy.cn/ops/162356.html

相关文章

unity学习60: 滑动条 和 滚动条 滚动区域

目录 1 滚动条 scrollbar 1.1 创建滚动条 1.2 scrollbar的子物体 1.3 scrollbar的属性 2 滚动视图 scroll View 2.1 创建1个scroll View 2.1.1 实际类比&#xff0c;网页就是一个 scroll view吧 2.2 子物体构成 2.3 核心component : Scroll Rect 3 可视区域 view p…

MCU+RTOS学习笔记1

0 学习内容 06_基于 Cubemx 实现按键控制 LED 灯&#xff08;裸机&#xff09; 1 知识学习 参考&#xff1a;1_Jlink介绍和使用 1.JTAG 1.JTAG JTAG是一种国际标准测试协议&#xff0c;主要用于芯片内部测试&#xff0c;标准的JTAG接口为4线&#xff1a;TMS、TCK、TDI、T…

Python--内置模块和开发规范(上)

1. 内置模块 1.1 JSON 模块 核心功能 序列化&#xff1a;Python 数据类型 → JSON 字符串 import json data [{"id": 1, "name": "武沛齐"}, {"id": 2, "name": "Alex"}] json_str json.dumps(data, ensure_a…

2025-02-28 学习记录--C/C++-C语言 scanf 中,%s 不需要加

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 scanf 中&#xff0c;%s 不需要加 & 格式化符号变量类型是否需要加 &原因%s字符数组不需要数组名本身就是指针&a…

夏普比率(Sharpe Ratio):衡量投资风险与收益的黄金标准(中英双语)

夏普比率&#xff08;Sharpe Ratio&#xff09;&#xff1a;衡量投资风险与收益的黄金标准 &#x1f4ca;&#x1f4c8; &#x1f4cc; 什么是夏普比率&#xff1f; 夏普比率&#xff08;Sharpe Ratio&#xff09; 由诺贝尔经济学奖得主 威廉夏普&#xff08;William F. Shar…

使用Docker将ros1自定义消息通过rosjava_bootstrap生成jar包

文章目录 预准备环境rosjava_bootstrap坏消息好消息 环境安装docker安装rosjava_bootstrap仓库rosjava_center仓库修改rosjava_bootstrap代码拉取docker镜像放置自己的自定义消息 启动docker编译 预准备环境 rosjava_bootstrap rosjava_bootstrap是将自定义的ROS消息生成java…

DeepSeek行业应用实践报告-智灵动力【112页PPT全】

DeepSeek&#xff08;深度搜索&#xff09;近期引发广泛关注并成为众多企业/开发者争相接入的现象&#xff0c;主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析&#xff1a; 一、技术核心优势 开源与低成本 DeepSeek基于开源架构&#xf…

cuda-12.4.0 devel docker 中源码安装 OpenAI triton

1&#xff0c;准备 docker 容器 下载docker image: $ sudo docker pull nvidia/cuda:12.6.2-devel-ubuntu20.04 创建容器&#xff1a; sudo docker run --gpus all -it --name cuda_LHL_01 -v /home/hongleili/ex_triton/tmp1:/root/ex_triton/tmp1 nvidia/cuda:12.6…