开源库nlohmann json使用备忘

nlohmann/json是一个用于解析JSON的开源C++库,口碑一流,无需额外安装其他第三方库,还支持单个头文件模式,使用起来非常方便直观。

1. 编译

从官网https://github.com/nlohmann/json的Release页面下载单个json.hpp即可直接使用,无需单独编译。

2. 使用示例

下面以示例的方式罗列nlohmann/json库的基本使用方法。

2.1 生成JSON

方式1

cpp 复制代码
int main()
{
    using json = nlohmann::json;

    json j;
    j["pi"] = 3.141;
    j["happy"] = true;
    j["name"] = "Niels";
    j["nothing"] = nullptr;
    j["answer"]["everything"] = 42;
    j["list"] = { 1, 0, 2 };
    j["object"] = { {"currency", "USD"}, {"value", 42.99} };

    // 转成字符串
    std::string strJSON = j.dump(2); // 2个空格的缩进

    std::cout << strJSON;
    return 0;
}

输出如下:

json 复制代码
{
  "answer": {
    "everything": 42
  },
  "happy": true,
  "list": [
    1,
    0,
    2
  ],
  "name": "Niels",
  "nothing": null,
  "object": {
    "currency": "USD",
    "value": 42.99
  },
  "pi": 3.141
}

方式2

cpp 复制代码
int main()
{
    using json = nlohmann::json;
    json j = {
        {"pi", 3.141},
        {"happy", true},
        {"name", "Niels"},
        {"nothing", nullptr},
        {"answer", {{"everything", 42}}},
        {"list", {1, 0, 2}},
        {"object", {{"currency", "USD"}, {"value", 42.99}}}
    };

    // 转成字符串
    std::string strJSON = j.dump(2);

    std::cout << strJSON;
    return 0;
}

输出内容与方式1一样。

方式3

cpp 复制代码
int main()
{
    using json = nlohmann::json;

    json j;
    j["pi"] = 3.141;
    j["happy"] = true;
    j["name"] = "Niels";
    j["nothing"] = nullptr;

    json j_answer;
    j_answer["everything"] = 42;

    j["answer"] = j_answer;

    json j_list = json::array();
    j_list.push_back(1);
    j_list.push_back(0);
    j_list.push_back(2);

    j["list"] = j_list;

    json j_object;
    j_object["currency"] = "USD";
    j_object["value"] = 42.99;

    j["object"] = j_object;

    // 转成字符串
    std::string strJSON = j.dump(2);

    std::cout << strJSON;
    return 0;
}

输出内容与方式1一样。

2.2 解析JSON

cpp 复制代码
int main()
{
    using json = nlohmann::json;

    std::string strJSON = u8R"(
    {
        "answer": {
             "everything": 42
        },
        "happy": true,
        "list": [
            1,
            0,
            2
         ],
        "name": "Niels",
        "nothing": null,
        "object": {
            "currency": "USD",
            "value": 42.99
        },
        "pi": 3.141
    }
    )";

    auto jsonObj = json::parse(strJSON);
    std::cout << jsonObj["pi"].get<float>() << std::endl; // 3.141
    std::cout << jsonObj["pi"].get<double>() << std::endl; // 3.141
    std::cout << std::boolalpha << jsonObj["happy"].get<bool>() << std::endl; // true
    std::cout << jsonObj["name"].get<std::string>() << std::endl; // Niels
    assert(jsonObj["nothing"] == nullptr);
    std::cout << jsonObj["answer"]["everything"].get<int>() << std::endl; // 42
    std::cout << jsonObj["list"].size() << std::endl; // 3
    std::cout << jsonObj["list"][0].get<int>() << std::endl; // 1
    std::cout << jsonObj["list"][1].get<int>() << std::endl; // 0
    std::cout << jsonObj["list"][2].get<int>() << std::endl; // 2
    std::cout << jsonObj["object"]["currency"].get<std::string>() << std::endl; // USD
    std::cout << jsonObj["object"]["value"].get<float>() << std::endl; // 42.99

    // 依次输出:
    // 1
    // 0
    // 2
    for (json::iterator it = jsonObj["list"].begin(); it != jsonObj["list"].end(); ++it) {
        std::cout << *it << std::endl;
    }

    return 0;
}

3. 异常处理

当解析和生成JSON出错时,nlohmann/json会抛出异常,因此在解析和生成JSON时,需要进行异常捕获。

cpp 复制代码
int main()
{
    using json = nlohmann::json;

    std::string strJSON = u8R"(
    {
        "pi": 3.141
    }
    )";

    try {
        auto jsonObj = json::parse(strJSON);
        std::cout << jsonObj["ppp"].get<float>() << std::endl;
    }
    catch (std::exception& e) {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

4. 判断成员是否存在

cpp 复制代码
int main()
{
    using json = nlohmann::json;

    std::string strJSON = u8R"(
    {
        "pi": 3.141
    }
    )";

    auto jsonObj = json::parse(strJSON);
    std::cout << std::boolalpha << jsonObj.contains("pi") << std::endl; // true
    std::cout << std::boolalpha << jsonObj.contains("ppp") << std::endl; // false

    return 0;
}

欢迎访问我的个人站点:https://jiangxueqiao.com

相关推荐
视觉小萌新6 小时前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
the3clipse7 小时前
MPC-HC 下载安装与最佳配置教程:免费开源、轻量无广告、支持 4K 硬解的 Windows 播放器
windows·播放器·安装教程·硬件加速·mpc-hc·字幕设置·lav filters
独隅8 小时前
WebStorm Windows 版 React / Next.js 实战替换指南
javascript·windows·webstorm
陈工大模型8 小时前
2026年11月最新免费解压软件横评:7-Zip 、 Win解压缩名列前茅
windows·软件工程·7-zip·压缩软件
翊众建站1 天前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson1 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
中二骚年1 天前
Windows 安全中心 / 防火墙故障,calc和Microsoft Store,终端(管理员)无法正常打开。 原因 + 修复方案
windows·安全·microsoft
万联WANFLOW1 天前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
AlanAshley1 天前
Windows 中导致延迟的软硬件及协议比重
windows
yuezhilangniao1 天前
win10中文 以及 PowerShell 开发日常
windows·powershell