前言
本文操作均在ubuntu20.04下进行。
安装
方法一:apt包管理器
①使用包管理器安装
这种方法比较简单,直接使用apt包管理器安装jsoncpp:
1
| 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为例:
1 2
| wget https://github.com/open-source-parsers/jsoncpp/archive/1.9.3.tar.gz tar xzf 1.9.3.tar.gz
|
③编译和安装
进入jsoncpp目录,使用cmake来配置项目并编译安装:
1 2 3 4 5 6
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <json/json.h> #include <iostream>
int main() { Json::Value root;
root["name"] = "John Doe"; root["age"] = 30; root["isAlive"] = true; root["address"]["city"] = "New York"; root["address"]["state"] = "NY";
Json::StreamWriterBuilder writer;
std::string output = Json::writeString(writer, root);
std::cout << output << std::endl;
return 0; }
|
读JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| int main() { std::string jsonString = R"({"name":"John Doe","age":30,"isAlive":true,"address":{"city":"New York","state":"NY"}})";
Json::CharReaderBuilder builder;
Json::Value root;
std::string errors;
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
输出
写JSON
读JSON