使用nlohmann/json库解析JSON,需包含头文件并定义json命名空间;2. 通过json::parse()方法解析字符串;3. 支持类似JavaScript的对象操作方式访问数据。

在C++中解析JSON,由于标准库不直接支持JSON处理,通常需要借助第三方库来完成。以下是几种常用且高效的JSON解析方法,适合不同项目需求。
使用nlohmann/json(推荐)
nlohmann的JSON for Modern C++ 是目前最流行的C++ JSON库之一,语法简洁,支持C++11及以上版本。优点:头文件仅需一个,易于集成;API直观,类似JavaScript对象操作。
安装方式:
基本用法示例:
立即学习“C++免费学习笔记(深入)”;
#include#include 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; if (j.contains("city")) { std::cout << "City: " << j["city"] << std::endl; } } catch (const std::exception& e) { std::cerr << "Parse error: " << e.what() << std::endl; } return 0; }
支持结构体映射、STL容器转换等高级功能,可读写JSON文件。
使用RapidJSON
RapidJSON是腾讯开源的高性能C++ JSON库,强调速度和内存效率。特点:零依赖、支持SAX和DOM两种解析模式,适合对性能要求高的场景。
使用示例(DOM方式):
功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标
#include "rapidjson/document.h" #include#include using namespace rapidjson; int main() { std::string json_str = R"({"product": "laptop", "price": 5999})"; Document doc; doc.Parse(json_str.c_str()); if (!doc.HasParseError() && doc.IsObject()) { if (doc.HasMember("product") && doc["product"].IsString()) { std::cout << "Product: " << doc["product"].GetString() << std::endl; } if (doc.HasMember("price") && doc["price"].IsNumber()) { std::cout << "Price: " << doc["price"].GetDouble() << std::endl; } } return 0; }
注意:RapidJSON默认不抛异常,需手动检查解析状态。
使用JsonCpp
JsonCpp是一个较早的C++ JSON库,广泛用于旧项目,API清晰但性能略低于前两者。编译安装:可通过包管理器如apt或源码编译。
- Ubuntu:
sudo apt install libjsoncpp-dev
代码示例:
#include#include #include int main() { std::string json_str = R"({"status": "ok", "count": 10})"; Json::Value root; Json::CharReaderBuilder builder; std::string errs; std::istringstream iss(json_str); if (parseFromStream(builder, iss, &root, &errs)) { std::cout << "Status: " << root["status"].asString() << std::endl; std::cout << "Count: " << root["count"].asInt() << std::endl; } else { std::cerr << "Parse error: " << errs << std::endl; } return 0; }
选择建议
小型项目或希望快速上手,推荐使用nlohmann/json,现代C++风格,文档丰富。
对性能敏感或嵌入式环境,可选RapidJSON,但注意API稍复杂。
维护老项目或已有JsonCpp依赖,继续使用也无妨。
基本上就这些,根据项目实际情况引入对应库即可完成JSON解析任务。不复杂但容易忽略的是错误处理,记得加try-catch或状态判断。









