开源库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

相关推荐
一禅(OneZen)1 小时前
「Windows/Mac OS」AIGC图片生成视频 ,webui + stable-diffusion环境部署教程
windows·stable diffusion
AirDroid_cn1 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
小龙在山东4 小时前
Python 包管理工具 uv
windows·python·uv
昏睡红猹4 小时前
我在厂里搞wine的日子
windows·wine
love530love7 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
1024小神12 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows
程序视点20 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
wuk99821 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk1 天前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
百锦再1 天前
.Net配置文件appsetting.json的几种读取方法
chrome·json·.net·依赖注入·appsetting·web.config