nlohmann::json::parse() 直接解析合法JSON字符串为通用JSON对象,不自动映射自定义类;需用try/catch捕获parse_error异常,或用parse(str,nullptr,false)禁用异常,推荐std::string_view避免拷贝。

用 nlohmann::json::parse() 解析字符串最直接
只要字符串格式合法,nlohmann::json::parse() 就能转成 nlohmann::json 对象。它不自动映射到自定义 C++ 类,只是构建一个通用的 JSON 树结构。
常见错误是传入空指针或非法 UTF-8 字符串,会抛出 nlohmann::json::parse_error 异常;没捕获的话程序直接崩溃。
- 推荐始终用
try/catch包裹,尤其输入来自文件、网络或用户时 - 如果确定字符串安全且想省略异常处理,可用
nlohmann::json::parse(str, nullptr, false)关闭异常(返回空对象而非抛错) -
std::string_view传参比std::string更轻量,避免不必要的拷贝
std::string json_str = R"({"name":"Alice","age":30})";
try {
nlohmann::json j = nlohmann::json::parse(json_str);
std::cout << j["name"].get<std::string>() << "\n"; // 输出 Alice
} catch (const nlohmann::json::parse_error& e) {
std::cerr << "JSON parse error at byte " << e.byte << ": " << e.what() << "\n";
}
把 JSON 映射到自定义 struct 要靠 from_json() 重载
nlohmann/json 不靠宏或反射,而是要求你为每个 struct 显式定义 void from_json(const nlohmann::json&, YourStruct&) 函数。这是最可控也最容易出错的一环。
典型坑点:字段名拼写不一致、类型不匹配(比如 JSON 里是字符串但代码里试图读成 int)、漏掉必填字段导致默认值被静默使用。
立即学习“C++免费学习笔记(深入)”;
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 函数必须在
nlohmann命名空间内,否则编译器找不到 ADL(argument-dependent lookup) - 建议用
j.at("field").get<T>()而非j["field"].get<T>():前者查不到就抛out_of_range,后者返回默认构造值(容易掩盖问题) - 支持嵌套结构,子 struct 同样需要自己的
from_json重载
struct Person {
std::string name;
int age;
};
namespace nlohmann {
void from_json(const json& j, Person& p) {
p.name = j.at("name").get<std::string>();
p.age = j.at("age").get<int>();
}
}
// 使用:
Person p = j.get<Person>(); // 自动触发 from_json
get<T>() 和 get_ref<T&>() 的区别很关键
当你调用 j.get<Person>(),底层会构造一个临时 Person,再通过 from_json 填充;而 j.get_ref<Person&>() 是直接填充已存在的对象引用——但前提是这个对象已经存在且可修改。
多数时候你不需要 get_ref。误用会导致未定义行为:比如对 const 对象取 ref、或对刚构造的临时对象取 ref 并绑定到局部变量。
-
get<T>()安全、常用,适用于绝大多数场景 -
get_ref<T&>()只在性能敏感且对象生命周期明确可控时考虑(例如反复解析同一块 JSON 到同一个实例) - 别对
const对象或右值调用get_ref,编译可能过,运行会崩
中文字段或特殊字符要注意编码和转义
nlohmann/json 默认按 UTF-8 处理所有字符串。如果你的源字符串含 GBK 或其他编码的中文,直接 parse 必然失败或乱码——它不会自动检测编码。
常见现象:parse_error 提示 “invalid UTF-8 byte” 或字段读出来是空字符串。
- 确保输入字符串确实是 UTF-8 编码;Windows 控制台默认是 GBK,需先转换(如用
std::wstring_convert+std::codecvt_utf8,或更现代的std::iconv/ 第三方库) - JSON 字符串内部的 Unicode 转义(如
"\u4f60\u597d")会被自动解码为 UTF-8 字节,无需额外处理 - 输出时默认也是 UTF-8,若要写入 Windows 文件并希望记事本正常打开,得加 BOM(手动在字符串前加
"\xEF\xBB\xBF")
parse() 得到通用树,再靠手工写的 from_json() 把树“翻译”进你的类型。中间没有魔法,但每一步的边界条件(空值、类型错、编码错、异常没抓)都容易漏。

















