Windows11中VS2026使用C++ 现代化json库nlohmann的3种方式

Windows11中VS2026使用C++ 现代化json库nlohmann

一、方式1:VS2026中直接在C++控制台项目中引入include头文件

1. 下载 nlohmann json源代码

C++ 现代化json库nlohmann的Github源代码地址为:https://github.com/nlohmann/json,官网地址为:https://json.nlohmann.me/

下载源代码:

复制代码
git clone https://github.com/nlohmann/json.git

或者

bash 复制代码
git clone git@github.com:nlohmann/json.git

或者直接下载源代码zip包

解压之后源代码目录结构如下:

2、VS2026中创建C++项目,并引入头文件

在Windows11上使用VS2026新建一个C++控制台项目,将下载后的E:\projects\json-develop\include目录拷贝到C++项目根目录下,无须自己手动编译动态库或静态库,使用比较简单。

对应的C++控制台源代码文件nlohmannJsonDemo.cpp内容如下:

cpp 复制代码
#include <iostream>

#include "nlohmann/json.hpp"

using nlohmann::json;

// JSON for Modern C++
// https://github.com/nlohmann/json
// https://json.nlohmann.me/

// 【C++ JSON 开源库】nlohmann入门使用总结
// https://www.cnblogs.com/linuxAndMcu/p/14503341.html

// nlohmann::json库的介绍与使用
// https://shona3n.github.io/2021/cpp/json-guidance/


// 惊喜!C++ 现代化json库nlohmann更高效的使用方式
// https://zhuanlan.zhihu.com/p/671881495

// nlohmann json NLOHMANN_DEFINE_TYPE_INTRUSIVE
// https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/

// https://github.com/nlohmann/json/issues/4104

namespace Ybu {
    // 首先定义一个结构体
    struct Person {
        std::string name;
        std::string address;
        int age;
    };

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

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


int main()
{
    Ybu::Person p{ "Ned Flanders", "744 Evergreen Terrace", 60 };
    json j = p;
    std::cout << j << std::endl;
    // {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}

    // conversion: json -> Person
    auto p2 = j.get<Ybu::Person>();

    std::cout << "Person name: " << p2.name << ", address: " << p2.address << ", age: " << p2.age << std::endl;

    // that's it

    return 0;
}

Ctrl+F5运行结果如下图所示:

二、方式2:VS2026中通过NuGet包管理器安装nlohmann.json库

首先使用VS2026创建一个空的C++项目比如命名为NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_test_01,并添加一个NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_test_01.cpp的源文件,内容如下:

cpp 复制代码
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;
using namespace nlohmann::literals;

namespace ns
{
    struct person
    {
        std::string name;
        std::string address;
        int age;
    };

    NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age)
} // namespace ns

int main()
{
    ns::person p = { "Ned Flanders", "744 Evergreen Terrace", 60 };

    // serialization: person -> json
    json j = p;
    std::cout << "serialization: " << j << std::endl;

    // deserialization: json -> person
    json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
    auto p2 = j2.get<ns::person>();

    // incomplete deserialization:
    json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
    try
    {
        auto p3 = j3.get<ns::person>();
    }
    catch (const json::exception& e)
    {
        std::cout << "deserialization failed: " << e.what() << std::endl;
    }

    return 0;
}

然后选中该项目并设置启动项目,鼠标右键菜单中选择【管理 NuGet 包(N)】,然后搜索nlohmann.json 包,如下图所示:

选中nlohmann.json包之后安装即可,会在项目中生成一个packages.config的文件,内容如下:

cpp 复制代码
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="nlohmann.json" version="3.12.0" targetFramework="native" />
</packages>

这样看起来和C#和.Net中的包有点类似了。

当然我们可以卸载安装过的包,也可以安装其他包。

运行结果下图所示:

当然如果通过NuGet方式能够找到对应的C++库,第二种方式更简单一些,无须自己手动编译第三方源代码。

三、方式3:使用vcpkg安装nlohmann::json库

众所周知,其他高级开发语言有包管理器,比如C#有nuget,Java有maven和gradle,Python有pip,Node.js有npm和yarn。但是之前C++社区没有一个跨平台的包管理器,为此导致了一个问题:同一套代码比如我编译成win32 debug的程序无法在win64的Windows机器上运行,且debug的lib库和release版的也不兼容。

vcpkg 是跨平台的 C/C++ 包管理器。 快速获取对数千个高质量开放源代码库的访问权限,从而为应用程序提供支持,并在内部共享专用组件的集合。vcpkg 是由 Microsoft 和 C++ 社区维护的免费开源 C/C++ 包管理器,可在 Windows、macOS 和 Linux 上运行。 它是核心的 C++ 工具,使用 C++ 和 CMake 脚本编写。 它旨在解决管理 C/C++ 库的独特难题。

1. 安装vcpkg并通过vcpkg查找安装nlohmann-json库

可以从https://github.com/Microsoft/vcpkg微软官方下载vcpkg安装包

然后打开git bash命令行窗口,依次运行如下命令:

cpp 复制代码
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install nlohmann-json

安装好vcpkg后,可以通过./vcpkg.exe seatch nlohmann-json搜索nlohmann-json库,如下图所示:

找到之后,可以通过./vcpkg install nlohmann-json在vcpkg中安装nlohmann-json

2.VS2026中创建一个空的C++控制台项目并使用nlohmann_json库

在VS2026中创建一个空的C++控制台项目,添加一个nlohmannJsonDemo01.cpp的源文件,内容如下:

cpp 复制代码
#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;
using namespace nlohmann::literals;

namespace ns
{
    class person
    {
    private:
        std::string name = "John Doe";
        std::string address = "123 Fake St";
        int age = -1;

    public:
        person() = default;
        person(std::string name_, std::string address_, int age_)
            : name(std::move(name_)), address(std::move(address_)), age(age_)
        {
        }

        NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(person, name, address, age)
    };
} // namespace ns

int main()
{
    ns::person p = { "Ned Flanders", "744 Evergreen Terrace", 60 };

    // serialization: person -> json
    json j = p;
    std::cout << "serialization: " << j << std::endl;

    // deserialization: json -> person
    json j2 = R"({"address": "742 Evergreen Terrace", "age": 40, "name": "Homer Simpson"})"_json;
    auto p2 = j2.get<ns::person>();

    // incomplete deserialization:
    json j3 = R"({"address": "742 Evergreen Terrace", "name": "Maggie Simpson"})"_json;
    auto p3 = j3.get<ns::person>();
    std::cout << "roundtrip: " << json(p3) << std::endl;

    return 0;
}

鼠标双击打开第2行的#include <nlohmann/json.hpp>可以看到json.hpp头文件所在路径为:D:\env\vcpkg\installed\x64-windows\include\nlohmann,如下图所示:

Ctrl+F5运行上述C++控制台项目,结果如下图所示:

相关推荐
CSDN_RTKLIB1 分钟前
【std::vector】避免频繁扩容方法
c++·stl
Blossom.1184 分钟前
联邦迁移学习实战:在数据孤岛中构建个性化推荐模型
开发语言·人工智能·python·深度学习·神经网络·机器学习·迁移学习
yaoxin5211235 分钟前
288. Java Stream API - 创建随机数的 Stream
java·开发语言
superman超哥8 分钟前
迭代器适配器(map、filter、fold等):Rust函数式编程的艺术
开发语言·rust·编程语言·rust map·rust filter·rust fold·rust函数式
yuanmenghao9 分钟前
自动驾驶中间件iceoryx - 同步与通知机制(二)
开发语言·单片机·中间件·自动驾驶·信息与通信
郝学胜-神的一滴20 分钟前
Qt实现圆角窗口的两种方案详解
开发语言·c++·qt·程序人生
CSDN_RTKLIB20 分钟前
【std::vector】size、capacity小结
c++·stl
superman超哥21 分钟前
Iterator Trait 的核心方法:深入理解与实践
开发语言·后端·rust·iterator trait·trait核心方法
冰暮流星22 分钟前
javascript短路运算
开发语言·前端·javascript
kylezhao201924 分钟前
在C#中实现异步通信
开发语言·c#