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++控制台项目,结果如下图所示:

相关推荐
步步为营DotNet2 小时前
深度剖析.NET中HttpClient的请求重试机制:可靠性提升与实践优化
开发语言·php·.net
羑悻的小杀马特2 小时前
LRU Cache:高频访问数据的“智能保鲜舱”与经典淘汰艺术
c++·后端·lru cache·热点数据与冷数据
zephyr052 小时前
C++ STL string 用法详解与示例
开发语言·c++
郝学胜-神的一滴2 小时前
Linux线程的共享资源与非共享资源详解
linux·服务器·开发语言·c++·程序人生·设计模式
郝学胜-神的一滴2 小时前
Linux进程与线程的区别:从内存三级映射角度深入解析
linux·服务器·c++·程序人生
默凉2 小时前
c++使用http发送图像
开发语言·c++·http
不爱吃糖的程序媛2 小时前
OpenHarmony PC 第三方 C/C++ 库适配完整指南
c语言·c++·harmonyos
雪域迷影2 小时前
nlohmann::json库对象和json结构体转换的新方式
c++·json·nlohmann_json库
木千2 小时前
Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式
开发语言·qt