[toc]
简介
Json11 是 dropbox 开源的一个轻量级 C++ JSON 库(单头文件 + 单实现文件,GitHub: dropbox/json11)。它提供了简洁的 API,支持解析、构建、序列化 JSON 数据,支持注释解析与字符串字面量。
核心类型
| 类型 | 含义 |
|---|---|
Json | JSON 值(可表示 null、bool、数值、字符串、数组、对象) |
Json::object | 键值对容器(本质是 std::map<std::string, Json>) |
Json::array | 数组容器(本质是 std::vector<Json>) |
JsonParse | 解析选项(如 COMMENTS 支持注释) |
常用方法
Json::parse(str, err, flags):解析字符串,返回Json;失败时err非空。Json::object{...}/ 下标jobj["key"]:构建对象。.dump():序列化输出 JSON 字符串。.is_*():判断类型(is_object/is_array/is_string等)。.operator[]:按 key 取值。
cpp
// 1. 待解析的 JSON 字符串(支持注释 COMPARSE::COMMENTS)
std::string strMsg =
R"({
"user" :"test",
"status":"login", //登录状态:login、logout
"result":"1", //登录和登出结果,1表示成功,0表示失败
"reason":"", //原因,比如超时退出,准入策略限制导致登录失败等
"token":"xxx" //token内容
})";
std::string strMsg_empty = "";
Json::object jstest = Json::object{};
string err;
// 解析(允许注释)
const auto json = Json::parse(strMsg_empty, err, JsonParse::COMMENTS);
// 方式一:用 object 下标构建
jstest["msgtype"] = "test";
jstest["data"] = (json);
Json json1 = Json(jstest);
std::cout << json1.dump();
// 方式二:用初始化列表构建
const Json obj = Json::object({
{ "msgtype", "TEST" },
{ "data", json },
});
std::cout << obj.dump() << std::endl;常见读取用法
cpp
// 读取示例
Json j = Json::parse(R"({"a": 1, "b": [1,2,3], "c": {"x":"y"}})", err);
int a = j["a"].int_value(); // 取整数值
std::string b2 = std::to_string(j["b"][1].int_value()); // 取数组第2个元素
std::string x = j["c"]["x"].string_value(); // 嵌套取值
if (j["a"].is_null()) { /* 处理缺失字段 */ }未命中 key 时会返回一个
nullJson,因此先is_null()判断或设置默认值能避免崩溃。
补充说明
- 源文件为
json11.cpp+json11.hpp,直接拷贝进工程即可使用,无第三方依赖。 - 支持
--显式转换为各种基本类型:double_value()、bool_value()、number_value()等。 - 相比
nlohmann/json,Json11 更轻量(体积小、无头文件 C++11 依赖),适合对库体积敏感的场景。