C++如何解析JSON数据_C++使用nlohmann/json库教程【三方】

6次阅读

直接使用nlohmann/json库实现jsonc++对象互转:下载单头文件json.hpp包含即可;解析用json::parse()并捕获异常;取字段优先用.value()或.contains()避免崩溃;序列化用.dump()控制格式;自定义类型需ADL支持。

C++如何解析JSON数据_C++使用nlohmann/json库教程【三方】

直接用 nlohmann/json,别自己手写解析器——它把 JSON 的序列化/反序列化变成了 C++ 原生对象的赋值和读取。

怎么装 nlohmann/json(单头文件,不编译)

它本质就是一个 nlohmann/json.hpp 文件,没有构建步骤:

  • gitHub 下载最新 release 的单文件:https://github.com/nlohmann/json/releases(找 json.hpp
  • 放进项目目录(比如 include/nlohmann/json.hpp),然后在代码里 #include
  • 确保编译器支持 C++11(最低要求),推荐 C++17 或更高
  • 不需要链接任何库,也不需要 cmake find_package —— 它是 header-only

怎么把 JSON 字符串转成 C++ 对象(parse)

核心是 nlohmann::json 类型,它能自动推导结构。常见错误是忽略异常:

  • nlohmann::json::parse() 解析字符串,失败会抛 nlohmann::json::parse_error
  • 别直接 nlohmann::json j = "{...}"; —— 这会调用字符串构造函数,不是解析,结果是字符串字面量
  • 正确写法:auto j = nlohmann::json::parse(json_str);json_strstd::String 或 C 风格字符串
  • 如果输入不可信(如网络响应),必须 try/catchtry { auto j = json::parse(s); } catch (const json::parse_error& e) { /* e.what(), e.byte */ }

怎么从 json 对象里取字段(避免 runtime_error)

字段不存在时默认行为是抛 nlohmann::json::type_errorout_of_range,不是返回空或 nullptr:

立即学习C++免费学习笔记(深入)”;

  • 安全访问用 .value("key", default_value),例如 j.value("age", 0),类型必须匹配(intstd::string 等)
  • 检查字段是否存在用 j.contains("key"),返回 bool
  • 强制取值(带断言)用 j["key"],但一旦 key 不存在就崩溃;数组同理,j[i] 越界也 crash
  • 嵌套访问建议链式判断:j.contains("user") && j["user"].contains("name") ? j["user"]["name"].get<:string>() : ""
  • 类型转换要显式:j["count"].get(),不能直接 (int)j["count"]

怎么把 C++ 对象转成 JSON 字符串(serialize)

最简场景下直接 .dump(),但要注意格式和精度:

  • j.dump() 生成紧凑 JSON(无空格);j.dump(2) 生成缩进为 2 的可读格式
  • 浮点数默认保留 6 位小数,如需更多,设 j.dump(2, ' ', true, json::error_handler_t::replace) 不够,得改 json::default_float_precision 或用自定义序列化
  • 自定义类型要支持 ADL(argument-dependent lookup):在类同名命名空间里定义 to_json(json&, const T&)from_json(const json&, T&)
  • 注意循环引用:json 不检测对象自引用,会无限递归导致溢出

真正麻烦的从来不是“怎么写”,而是字段名拼错、类型假设错误、没处理缺失字段、或者把 parse 和构造函数混用——这些地方一出错,报的都是运行时异常,编译器拦不住。

text=ZqhQzanResources