jsoncpp的安装及使用
前言
本文操作均在ubuntu20.04下进行。
安装
方法一:apt包管理器
①使用包管理器安装
这种方法比较简单,直接使用apt包管理器安装jsoncpp:
apt install libjsoncpp-dev
这条命令会安装jsoncpp的开发库和必需的文件
②查看头文件和库文件
安装完毕后我们可以去找一下jsoncpp的头文件和库文件
头文件位于/usr/include/jsoncpp/json/
库文件位于/usr/lib/x86_64-linux-gnu/
但是我们通过头文件的version.h和动态库文件的realname,可以知道使用apt包管理器安装的jsoncpp的版本号为1.7.4
那如果我需要安装的是jsoncpp的其他版本,就需要下载源代码并编译安装。
方法二:源码编译安装
①在开始编译前,首先要确保系统中安装了g++
和cmake
②下载jsoncpp源码
从github下载jsoncpp的特定版本并解压,以1.9.3为例:
wget https://github.com/open-source-parsers/jsoncpp/archive/1.9.3.tar.gz
tar xzf 1.9.3.tar.gz
③编译和安装
进入jsoncpp目录,使用cmake来配置项目并编译安装:
cd jsoncpp-1.9.3
mkdir build
cd build
cmake .. -DBUILD_SHARED_LIBS=ON
make
make install
注意,在cmake ..
后面加上了-DBUILD_SHARED_LIBS=ON
选项,会生成静态库和共享库。若不添加,则只会生成静态库。
④查看头文件和库文件
通过此方法安装的jsoncpp,其头文件位于/usr/local/include/json/
,库文件位于/usr/local/lib/
。
也不知道为啥,1.9.3版本的共享库soname是libjsoncpp.so.24
使用
编写示例代码
写JSON
#include <json/json.h>
#include <iostream>
int main()
{
// 创建一个Json::Value对象
Json::Value root;
// 向对象中添加数据
root["name"] = "John Doe";
root["age"] = 30;
root["isAlive"] = true;
root["address"]["city"] = "New York";
root["address"]["state"] = "NY";
// 创建一个Json::StreamWriterBuilder
Json::StreamWriterBuilder writer;
// 将Json::Value对象转换为字符串
std::string output = Json::writeString(writer, root);
// 打印输出
std::cout << output << std::endl;
return 0;
}
读JSON
int main()
{
// JSON字符串
std::string jsonString = R"({"name":"John Doe","age":30,"isAlive":true,"address":{"city":"New York","state":"NY"}})";
// 创建一个Json::CharReaderBuilder
Json::CharReaderBuilder builder;
// 创建一个Json::Value对象
Json::Value root;
// 创建一个错误信息字符串
std::string errors;
// 解析JSON字符串
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.size(), &root, &errors);
if (!parsingSuccessful) {
// 打印错误信息并退出
std::cout << "Error parsing JSON: " << errors << std::endl;
return 1;
}
// 提取并打印数据
std::cout << "Name: " << root["name"].asString() << std::endl;
std::cout << "Age: " << root["age"].asInt() << std::endl;
std::cout << "Is Alive: " << (root["isAlive"].asBool() ? "Yes" : "No") << std::endl;
std::cout << "City: " << root["address"]["city"].asString() << std::endl;
std::cout << "State: " << root["address"]["state"].asString() << std::endl;
return 0;
}
编译链接
具体操作略
注意链接时要加上-ljsoncpp