[toc]

简介

Json11 是 dropbox 开源的一个轻量级 C++ JSON 库(单头文件 + 单实现文件,GitHub: dropbox/json11)。它提供了简洁的 API,支持解析、构建、序列化 JSON 数据,支持注释解析与字符串字面量。

核心类型

类型含义
JsonJSON 值(可表示 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 取值。
C++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;

常见读取用法

C++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 时会返回一个 null Json,因此先 is_null() 判断或设置默认值能避免崩溃。

补充说明

  • 源文件为 json11.cpp + json11.hpp,直接拷贝进工程即可使用,无第三方依赖。
  • 支持 -- 显式转换为各种基本类型:double_value()bool_value()number_value() 等。
  • 相比 nlohmann/json,Json11 更轻量(体积小、无头文件 C++11 依赖),适合对库体积敏感的场景。