😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍jsoncpp读写json数据 🍭
⏰发布时间⏰: 2025-02-27 20:13:17
本文未经允许,不得转发!!!
🎄一、概述
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::StreamWriterBuilder
和Json::writeString
将root
这个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使用小结