最常踩的坑是类型不匹配和嵌套处理缺失;需严格转义字符串中的”、\、控制字符,key须转为字符串,嵌套结构需递归处理,手动拼接仅适用于无特殊字符且无嵌套的简单场景。
std::map 转 JSON 时最常踩的坑是类型不匹配和嵌套处理缺失
直接用 std::ostringstream 拼接引号、逗号、花括号,看似简单,但遇到 std::string 中含双引号、换行、\uXXXX Unicode 字符,或 value 是 std::map/std::vector 嵌套时,手拼几乎必然出错。JSON 标准要求字符串必须转义 "、\、控制字符(如 \n、\r),且 key 必须是字符串——而 std::map 的 key 可能是 int 或 double,需显式转换。
手动拼接仅适用于固定结构、无特殊字符的简单场景
若确认 key 和 value 全为 ASCII 字符串、不含引号/反斜杠/控制符,且无嵌套,可快速手写:
std::string map_to_json_simple(const std::map& m) {
std::ostringstream oss;
oss << "{";
bool first = true;
for (const auto& [k, v] : m) {
if (!first) oss << ",";
oss << "\"" << k << "\":\"" << v << "\"";
first = false;
}
oss << "}";
return oss.str();
}
但以下情况会立刻崩坏:
-
v是"user says: \"hello\""→ 输出非法 JSON(未转义内部双引号) -
k是"price"但 value 是12.99(double)→ 手拼会变成"12.99"(字符串),而非 JSON 数字 - value 是
std::vector{1,2,3}→ 完全无法处理
nlohmann/json 库是最轻量且符合直觉的选择
它把 std::map 自动映射为 JSON object,支持任意嵌套,且默认做完整转义:
立即学习“C++免费学习笔记(深入)”;