0

0

c++中处理JSON数据有哪些好的开源库? (nlohmann/json实例)

穿越時空

穿越時空

发布时间:2026-01-10 15:04:51

|

285人浏览过

|

来源于php中文网

原创

选nlohmann/json因其头文件即用、无依赖、语法现代、错误提示清晰;支持operator[]、==、结构化绑定,兼容string_view和移动语义;仅需包含json.hpp即可解析与序列化JSON。

c++中处理json数据有哪些好的开源库? (nlohmann/json实例)

为什么选 nlohmann/json 而不是其他库

因为它的头文件即用、无依赖、语法接近现代 C++,且错误提示清晰。相比 jsoncpp(需编译、API 陈旧)或 rapidjson(模板繁杂、手动管理内存),nlohmann/jsonjson 类型像内置类型一样自然:支持直接用 operator[]operator==、结构化绑定,也兼容 std::string_view 和移动语义。

快速上手:读取和写入 JSON 字符串

只需一个头文件,不需链接任何库。下载 json.hpp 放入项目目录后,直接 #include "json.hpp" 即可使用。

#include "json.hpp"
#include 
#include 

using json = nlohmann::json;

int main() {
    // 解析字符串
    std::string s = R"({"name":"Alice","age":30,"hobbies":["coding","reading"]})";
    json j = json::parse(s);

    // 访问字段(自动类型检查)
    std::string name = j["name"];           // 自动转 string
    int age = j["age"];                     // 自动转 int
    std::vector hobbies = j["hobbies"]; // 自动转 vector

    // 序列化回字符串
    std::string output = j.dump(2); // 缩进 2 空格
    std::cout << output << "\n";
}
  • R"(...)" 原始字符串字面量避免转义麻烦
  • j["missing_key"] 默认返回 json::value_t::null,访问前建议用 j.contains("key")j.is_null() 判断
  • dump() 默认不缩进;传整数参数控制缩进空格数

常见坑:类型不匹配与异常处理

解析成功不等于字段可用——JSON 中的 "123" 是字符串,不是数字;null 值会静默转成默认构造值,容易掩盖逻辑错误。

  • 强制类型转换失败会抛 nlohmann::json::type_error,例如 j["age"].get()"thirty" 失败
  • 推荐用 get() + 异常捕获,或更安全的 get_ptr()(返回 nullptr 表示失败)
  • 对不确定结构的数据,先用 j.is_object() / j.is_array() / j.is_string() 检查类型
try {
    int x = j["count"].get(); // 可能 throw
} catch (const nlohmann::json::exception& e) {
    std::cerr << "JSON error: " << e.what() << "\n";
}

进阶用法:自定义类型序列化

让自己的结构体支持 JSON 自动读写,只需定义 to_jsonfrom_json 两个非成员函数,放在类所在命名空间内即可。

LALALAND
LALALAND

AI驱动的时尚服装设计平台

下载

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

struct Person {
    std::string name;
    int age;
};

void to_json(json& j, const Person& p) {
    j = json{{"name", p.name}, {"age", p.age}};
}

void from_json(const json& j, Person& p) {
    j.at("name").get_to(p.name);
    j.at("age").get_to(p.age);
}

// 使用:
Person p{"Bob", 25};
json j = p;           // 自动调用 to_json
Person p2 = j.get(); // 自动调用 from_json

注意:j.at("key") 抛异常(比 j["key"] 更严格),适合必须存在的字段;get_to() 是就地赋值,避免临时对象构造开销。

嵌套结构、std::optional、容器类型都可同样处理,但要注意循环引用会导致无限递归 —— nlohmann/json 不做运行时环检测,得靠设计规避。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

408

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

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

精品课程

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

共101课时 | 8.2万人学习

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

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号