最省事的C++ JSON解析方案是nlohmann/json,因其header-only、语法简洁、无需编译依赖;需注意异常处理、类型检查、空值验证及UTF-8编码问题。

用 nlohmann/json 解析 JSON 字符串最省事
绝大多数 C++ 项目现在都直接用 nlohmann/json,它 header-only、语法接近 Python,不用编译依赖,#include 就能用。别自己手写解析器或硬啃 jsoncpp 那套老 API —— 容易漏空值、类型错配、内存泄漏。
安装只需把 json.hpp 拷进工程,或者用 vcpkg:vcpkg install jsoncpp(但推荐直接用 nlohmann)。
- 解析失败时抛
json::parse_error异常,必须try/catch,否则程序崩 -
json j = json::parse(str)后,j.is_object()、j.is_array()、j.is_number()等判断类型再取值,别直接j["key"] - 访问嵌套字段前先检查是否存在:
j.contains("data") && j["data"].is_object(),否则j["data"]["items"]会静默返回 null 值,后续调.get<int>()崩
从文件读 JSON 时注意编码和换行
std::ifstream 默认按系统本地编码读,如果 JSON 文件是 UTF-8 且含中文,Windows 下可能乱码;Linux/macOS 一般没问题。别用 std::getline 逐行拼接 —— JSON 允许换行,但缩进格式不统一时容易丢数据。
- 用
std::ifstream f("config.json"); f.seekg(0, std::ios::end); size_t size = f.tellg(); f.seekg(0); std::string buf(size, ' '); f.read(&buf[0], size); json j = json::parse(buf); - 更稳妥:用
std::ifstream配合std::noskipws,并确保文件保存为 UTF-8 无 BOM - 如果文件很大(>10MB),考虑流式解析(
nlohmann不支持),换simdjson或rapidjson的 SAX 模式
json::parse() 报 [json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value
这错误几乎全是输入为空或含不可见字符。不是语法写错,而是根本没读到有效 JSON 文本。
立即学习“C++免费学习笔记(深入)”;
- 打印原始字符串长度:
std::cout << "len=" << str.length() << ", first char=" << (int)str[0];,确认不是空串或开头是\0、\xEF\xBB\xBF(BOM) - 用
str.erase(0, str.find_first_not_of(" \t\n\r"));清掉首尾空白,再判断str.empty() - HTTP 响应体里可能带
Content-Encoding: gzip,但你没解压就喂给json::parse()—— 这时候字节流是乱码,必然报 101
提取数值时类型不匹配导致静默截断
j["count"].get<int>() 遇到 "123"(字符串)或 123.45(浮点)会直接 throw,但 j["count"].get<int64_t>() 对 123.45 会截断成 123,不报错也不警告。
- 优先用
j["count"].is_number_integer()+.get<int64_t>(),或is_number_float()+.get<double>() - 不确定类型时,用
j["value"].dump()看原始结构,别靠猜 - 导出到 C 风格结构体时,别用
memcpy直拷json对象 —— 它内部是std::map和std::vector,二进制布局不固定


















