首页 > 其他分享 >nlohmann/json安装与使用

nlohmann/json安装与使用

时间:2024-09-14 18:20:52浏览次数:15  
标签:std JSON nlohmann json using include 安装

介绍

nlohmann/json 是一个用于处理 JSON 数据的 C++ 库,提供了简单而强大的 JSON 解析和生成功能。以其简洁易用、功能强大而受到广泛欢迎。

优点

  1. 简单易用:

    • 使用现代 C++ 特性,如自动类型推断和范围 for 循环,简化了 JSON 的创建、访问和操作。
  2. 与标准库兼容:

    • 它与 C++ 标准库兼容,能够方便地与 std::map、std::vector 等 STL 容器一起使用。
  3. 支持多种 JSON 数据类型:

    • 支持 JSON 对象、数组、字符串、数字、布尔值和 null 类型。
  4. 可读性和可维护性:

    • 提供了清晰的 API,使 JSON 数据的操作和读取更加直观和易于理解。
  5. JSON 序列化和反序列化:

    • 可以将 C++ 对象序列化为 JSON 格式,也可以将 JSON 数据反序列化为 C++ 对象。
  6. 异常处理:

    • 提供了友好的异常处理机制,可以处理 JSON 解析错误或类型错误等。

安装

下载源码

地址: https://github.com/nlohmann/json

linux

git clone --branch=v3.11.3 --single-branch --depth=1 https://github.com/nlohmann/json.git
mkdir build
cd build
cmake ..
make
sudo make install

安装在默认路径下/usr/local/include/nlohmann

windows

将nlohmann的头文件包含进项目工程就好了.

使用

基本用法

创建和操作 JSON 对象

#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建 JSON 对象
    json j = {
        {"name", "John Doe"},
        {"age", 30},
        {"is_student", false},
        {"courses", {"Math", "Science"}}
    };

    // 访问和修改 JSON 对象
    cout << "Name: " << j["name"] << endl;
    cout << "Age: " << j["age"] << endl;
    j["age"] = 31;  // 修改年龄

    // 输出整个 JSON 对象
    cout << j.dump(4) << endl;

    return 0;
}

解析 JSON 字符串

#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;
using namespace std;

int main() {
    string json_str = R"({"name": "Jane Doe", "age": 25, "is_student": true})";
    json j = json::parse(json_str);

    cout << "Name: " << j["name"] << endl;
    cout << "Age: " << j["age"] << endl;
    cout << "Is student: " << (j["is_student"] ? "Yes" : "No") << endl;

    return 0;
}

与 std::map 一起使用

从 std::map 创建 JSON 对象

#include <iostream>
#include <nlohmann/json.hpp>
#include <map>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建 std::map
    map<string, int> data = {
        {"Alice", 30},
        {"Bob", 25},
        {"Charlie", 35}
    };

    // 将 std::map 转换为 JSON 对象
    json j = data;

    // 输出 JSON 对象
    cout << j.dump(4) << endl;

    return 0;
}

从 JSON 对象创建 std::map

#include <iostream>
#include <nlohmann/json.hpp>
#include <map>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建 JSON 对象
    json j = {
        {"Alice", 30},
        {"Bob", 25},
        {"Charlie", 35}
    };

    // 从 JSON 对象转换为 std::map
    map<string, int> data = j.get<map<string, int>>();

    // 输出 std::map
    for (const auto& [key, value] : data) {
        cout << key << ": " << value << endl;
    }

    return 0;
}

与 std::vector 一起使用

从 std::vector 创建 JSON 数组

#include <iostream>
#include <nlohmann/json.hpp>
#include <vector>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建 std::vector
    vector<int> numbers = {1, 2, 3, 4, 5};

    // 将 std::vector 转换为 JSON 数组
    json j = numbers;

    // 输出 JSON 数组
    cout << j.dump(4) << endl;

    return 0;
}

从 JSON 数组创建 std::vector

#include <iostream>
#include <nlohmann/json.hpp>
#include <vector>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建 JSON 数组
    json j = {1, 2, 3, 4, 5};

    // 从 JSON 数组转换为 std::vector
    vector<int> numbers = j.get<vector<int>>();

    // 输出 std::vector
    for (int num : numbers) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

复杂的数据结构

#include <iostream>
#include <nlohmann/json.hpp>
#include <vector>
#include <map>

using json = nlohmann::json;
using namespace std;

int main() {
    // 创建嵌套数据结构
    map<string, vector<int>> data = {
        {"group1", {1, 2, 3}},
        {"group2", {4, 5, 6}}
    };

    // 将 std::map 和 std::vector 转换为 JSON 对象
    json j = data;

    // 输出 JSON 对象
    cout << j.dump(4) << endl;

    // 从 JSON 对象创建 std::map
    map<string, vector<int>> new_data = j.get<map<string, vector<int>>>();

    // 输出新创建的 std::map
    for (const auto& [key, value] : new_data) {
        cout << key << ": ";
        for (int num : value) {
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
}

通过 nlohmann/json,可以很方便地将 STL 容器与 JSON 数据互转。这使得在 C++ 中处理 JSON 数据变得更加自然,允许你轻松地利用 STL 容器的强大功能。

自定义对象

#include <iostream>
#include <nlohmann/json.hpp>

// 需要序列化的类
class Person {
public:
    std::string name;
    int age;

    // 序列化
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(Person, name, age)
};

int main() {
    // 创建一个 Person 对象
    Person person;
    person.name = "Alice";
    person.age = 30;

    // 将 Person 对象序列化为 JSON
    nlohmann::json j = person;
    std::cout << "Serialized JSON: " << j << std::endl;

    // 反序列化 JSON 为 Person 对象
    Person deserializedPerson = j.get<Person>();
    std::cout << "Deserialized Person - Name: " << deserializedPerson.name
              << ", Age: " << deserializedPerson.age << std::endl;

    return 0;
}

结束

标签:std,JSON,nlohmann,json,using,include,安装
From: https://blog.csdn.net/m0_51580562/article/details/142264165

相关文章

  • 【linux】centos7安装8.4.2版本mysql
    1、前置:清除mysql相关数据rpm-qa|grepmariadbrpm-e--nodeps查出来的文件名rpm-qa|grepmysqlrpm-e--nodeps查出来的文件名2、安装mysql依赖包(没试过不装会有什么问题)#查找libaio[root@node2~]#rpm-qa|greplibaio#安装libaio[root@node2~......
  • 安装vCenter VCSA 7.0 报错 Failed to run vdcpromo 的问题
    百度了一下说是DNS的问题,但我也设置了8.8.8.8或电信的dns,都不行。外网找了一下说要设置为127.0.0.1,但是7.0U3a后的版本不允许填写127.0.0.1了。最后找到一个通过CLI的方式安装可以避免这个问题。首先创建一个CLI的横版文件,内容如下:{"__version":"2.13.0","__comments......
  • 【Gradle下载】Gradle全部最新版本极速下载安装地址
    Gradle简介  gradle AndroidStudio中的Gradle是一个构建工具系统,主要用于构建、测试和部署Android应用程序。AndroidStudio中的Gradle是一个强大的构建工具系统,为Android开发提供了高效、灵活和可定制的构建流程。它能够帮助开发者管理项目的依赖......
  • SAP B1 Web Client & MS Teams App集成连载二:安装Install/升级Upgrade/卸载Uninstall
    一、安装/Install过程/Procedure:1.获取应用包并将其解压缩/Gettheapppackageandunzipit。导航到SAPBusinessOne产品包的以下文件夹:Packages.x64\MSTeamsIntegration\NavigatetothefollowingfolderintheSAPBusinessOneproductpackage:Packages.x64\MSTea......
  • 使用国内Docker源安装docker
    Docker源无法安装使用国内阿里源安装Docker#step1:安装必要的一些系统工具sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#Step2:添加软件源信息sudoyum-config-manager--add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.re......
  • docker安装运行kafka单机版
    这里我们安装一下kafka的单机版,由于kafka是基于zk进行管理的,如果我们没有安装过zk的话,需要进行安装好zk再安装kafka,当然如果已经安装过了,那就没必要安装了。我们可以执行dockerimages命令查看我们的zk镜像是否已经存在了。执行的主要的流程如下所示:1.docker拉取zookeeper镜像......
  • Utf8JsonWriter生成json
    privatestaticTaskWriteResponse(HttpContextcontext,HealthReporthealthReport){context.Response.ContentType="application/json;charset=utf-8";varoptions=newJsonWriterOptions{Indented=true};usingvarmemoryStr......
  • apple m芯片的深度学习框架 MLX 安装
    概述二手淘到一个M1MAX64g512g的applestudio。看了一下专为它开发的框架MLX,还有一堆例子。在官方网站的帮助文件中,找到了安装方法。官网安装PythonAPITobuildandinstalltheMLXpythonlibraryfromsource,first,cloneMLXfromitsGitHubrepo:gitclone......
  • 实战中学习:CMA和DMA_CMA导致安装大游戏失败的问题
     在实际遇到的问题中,遇到Android虚机中安装超过1.8G以上的大游戏APK文件时,就会出现安装失败的现象,通过分析,发现在/data/目录下进行大文件拷贝时,就会出现数据不一致,发现时内核打开了CMA和DMA_CMA,解决方法目前主要回退,将CMA和DMA_CMA的配置关闭现象: 拷贝5次:数据不一致/data/app......
  • PowerShell的安装与升级
    在旧版本的windows上执行powershell命令时,时不时出现一些奇怪的问题,常要花不少时间去摸索解决,现记录如下。WindowsServer2012R2安装PowerShell5https://download.microsoft.com/download/6/F/5/6F5FF66C-6775-42B0-86C4-47D41F2DA187/Win8.1AndW2K12R2-KB3191564-x64.msu完成后......