使用nlohmann/json库解析JSON字符串,只需包含json.hpp头文件并调用parse方法即可实现。

在C++中解析一个简单的JSON字符串,最常用的方法是使用第三方库。C++标准库本身不提供JSON解析功能,因此需要借助成熟的开源库来实现。以下是几种主流且易于使用的JSON解析方案。
使用nlohmann/json(推荐)
这是目前C++中最流行的JSON库之一,支持C++11及以上版本,头文件仅需一个,集成非常方便。安装方法:
从GitHub下载或通过包管理器安装:
- 下载地址:https://www.php.cn/link/b82e68e6366d4177332acdf3fa4d1e3a
- 只需将单个头文件
json.hpp包含到项目中即可使用。
基本用法示例:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <string>
#include "json.hpp"
// 使用命名空间
using json = nlohmann::json;
int main() {
std::string json_str = R"({"name": "Tom", "age": 25, "city": "Beijing"})";
try {
json j = json::parse(json_str);
std::cout << "Name: " << j["name"] << std::endl;
std::cout << "Age: " << j["age"] << std::endl;
std::cout << "City: " << j["city"] << std::endl;
} catch (const std::exception& e) {
std::cerr << "JSON解析失败: " << e.what() << std::endl;
}
return 0;
}
该库支持自动类型推导,例如:
j["name"].get<std::string>()j["age"].get<int>()
使用RapidJSON
RapidJSON是一个高性能的C++ JSON库,由腾讯开发,适合对性能要求较高的场景。特点:
- 无依赖、仅头文件
- 支持SAX和DOM两种解析方式
- 内存占用低,速度快
示例代码(DOM方式):
#include <iostream>
#include <string>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
using namespace rapidjson;
int main() {
std::string json_str = R"({"name": "Jerry", "age": 30})";
Document doc;
doc.Parse(json_str.c_str());
if (doc.HasParseError()) {
std::cerr << "JSON解析出错" << std::endl;
return -1;
}
if (doc.HasMember("name") && doc["name"].IsString()) {
std::cout << "Name: " << doc["name"].GetString() << std::endl;
}
if (doc.HasMember("age") && doc["age"].IsInt()) {
std::cout << "Age: " << doc["age"].GetInt() << std::endl;
}
return 0;
}
使用JsonCpp
JsonCpp是较早出现的C++ JSON库,接口清晰,适合初学者。安装方法:
- Ubuntu:
sudo apt-get install libjsoncpp-dev - 或从GitHub编译安装:https://www.php.cn/link/b4866aabd0aa02ee10cfc72af8eb195e
示例代码:
#include <iostream>
#include <string>
#include <json/json.h>
int main() {
std::string json_str = R"({"title": "Engineer", "salary": 15000})";
Json::Value root;
Json::CharReaderBuilder builder;
std::string errs;
std::istringstream ss(json_str);
if (!parseFromStream(builder, ss, &root, &errs)) {
std::cerr << "解析失败: " << errs << std::endl;
return -1;
}
std::cout << "Title: " << root["title"].asString() << std::endl;
std::cout << "Salary: " << root["salary"].asInt() << std::endl;
return 0;
}
选择建议
- 新手或快速开发:推荐使用 nlohmann/json,语法简洁,像原生C++一样自然。
- 高性能需求:考虑 RapidJSON,特别适合游戏、服务器等场景。
- 已有项目使用JsonCpp:可继续沿用,但新项目建议优先选前两者。
基本上就这些。只要引入合适的库,C++解析JSON并不复杂,关键是选对工具并处理好异常情况。











