nlohmann/json库怎么将JSON字符串解析为C++对象

风枫小哥_5599

风枫小哥_5599

2026-10-02

387人浏览

原创

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

nlohmann/json库怎么将json字符串解析为c++对象

用 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 () 

<h3>把 JSON 映射到自定义 struct 要靠 <code>from_json()</code> 重载</h3>
<p>nlohmann/<a style="color:#f60; text-decoration:underline;" title="js" href="https://m.php.cn/zt/15802.html" target="_blank">js</a>on 不靠宏或反射,而是要求你为每个 struct 显式定义 <code>void from_json(const nlohmann::json&, YourStruct&)</code> 函数。这是最可控也最容易出错的一环。</p>
<p>典型坑点:字段名拼写不一致、类型不匹配(比如 JSON 里是字符串但代码里试图读成 <code>int</code>)、漏掉必填字段导致默认值被静默使用。</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5790" title="Json Schema Toolkit"><img
														src="https://img.php.cn/upload/skill/000/000/081/179066171761941.jpg" alt="Json Schema Toolkit" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill5790" title="Json Schema Toolkit" class="overflowclass">Json Schema Toolkit</a>
													<p class="overflowclass">使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill5790" title="Json Schema Toolkit" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
  • 函数必须在 nlohmann 命名空间内,否则编译器找不到 ADL(argument-dependent lookup)
  • 建议用 j.at("field").get<t>()</t> 而非 j["field"].get<t>()</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<:string>();
    p.age = j.at("age").get<int>();
}
}

// 使用:
Person p = j.get<person>(); // 自动触发 from_json</person></int></:string>

get<t>()</t> 和 get_ref<t>()</t> 的区别很关键

当你调用 j.get<person>()</person>,底层会构造一个临时 Person,再通过 from_json 填充;而 j.get_ref<person>()</person> 是直接填充已存在的对象引用——但前提是这个对象已经存在且可修改。

多数时候你不需要 get_ref。误用会导致未定义行为:比如对 const 对象取 ref、或对刚构造的临时对象取 ref 并绑定到局部变量。

  • get<t>()</t> 安全、常用,适用于绝大多数场景
  • get_ref<t>()</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")
解析 JSON 到 C++ 对象的核心其实是两步:先用 parse() 得到通用树,再靠手工写的 from_json() 把树“翻译”进你的类型。中间没有魔法,但每一步的边界条件(空值、类型错、编码错、异常没抓)都容易漏。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json c++ 字符串解析

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.7万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习