【QT进阶】Qt http编程之nlohmann json库使用的简单介绍

往期回顾

【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客

【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客

【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客

【QT进阶】Qt http编程之nlohmann json库使用的简单介绍

一、nlohman json库

1、C++常用Json库

Jsoncpp

boost ison

Qt Json (不推荐使用)

nlohman::json (推荐使用)下

Qt有json解析相关的类,但是并不推荐使用,原因很简单,Qt中json解析的相关类只在qt中有用,为了避免以后不用qt就不会解析json了,建议是使用nlohmann/json,这个json适用于任何C++框架

2、什么是 nlohman::json

2.1下载地址

git repo: https://github.com/nlohmann/json

2.2基本介绍

nlohmann是一个C++的JSON库,它提供了方便的方式来解析、生成和操作JSON数据。该库由nlohmann编写,是一个开源项目,被广泛应用于C++开发中。

nlohmann库提供了简单易用的API,可以轻松地将JSON数据解析为C++对象,或者将C++对象序列化为JSON数据。它支持各种数据类型,包括字符串、数字、布尔值、数组和对象等。我们可以使用简洁的语法来访问和操作JSON数据,使得编写JSON处理代码变得更加简单和高效。

除了基本的JSON解析和生成功能,nlohmann库还提供了一些高级功能,如JSON合并、JSON差异比较、JSON数据查询等。这些功能可以帮助我们更方便地处理复杂的JSON数据,提高代码的可维护性和可读性。

二、具体解析示例

1、引入头文件

nlohman:json只需要一个头文件json.hpp,不需要编译成lib,直接放到项目中即可使用

复制代码
#include <iostream>
#include "json.hpp"
#include <string>


//取别名方便下面使用
using json_t = nlohmann::json;

using namespace std;

2、具体思路

2.1自定义json数据
复制代码
    //如果是没有多层嵌套的看一下怎么拿到
    json_t jRawdata; //定义一个json对象
    jRawdata["username"] = "jackli";
    jRawdata["pwd"] = "123456";
2.2dump方法序列化

这个适用于json格式只有一层的

复制代码
    // 序列化,把json数据转成string
    string _rawdata = jRawdata.dump();
    cout << _rawdata << endl;
2.3parse方法反序列化
复制代码
    // 反序列化,把string数据转成json
    string json_str = R"(
        {
            "date": "20220701",
            "level": 1,
            "msg": "register account",
            "status": "success",
            "username": "jackli"
        }
    )";

    try 
    {
        //关键的parse方法
        json_t j2 = json_t::parse(json_str);
        string date = j2["date"];
        cout << date << endl;
    }
2.4异常的catch参数
复制代码
catch (std::exception& e){}

3、整体代码

复制代码
int main()
{
    //如果是没有多层嵌套的看一下怎么拿到
    json_t jRawdata; //定义一个json对象
    jRawdata["username"] = "jackli";
    jRawdata["pwd"] = "123456";

    // 序列化,把json数据转成string
    string _rawdata = jRawdata.dump();
    cout << _rawdata << endl;

    // 反序列化,把string数据转成json
    string json_str = R"(
        {
            "date": "20220701",
            "level": 1,
            "msg": "register account",
            "status": "success",
            "username": "jackli"
        }
    )";

    try 
    {
        //关键的parse方法
        json_t j2 = json_t::parse(json_str);
        string date = j2["date"];
        cout << date << endl;
    }
    catch (std::exception& e)
    {
        cout << "json parse failed" << endl;
        return -1;
    }

    cout << "解析json数组" << endl;
    if (parse_array() != 0)
    {
        cout << "parse array failed" << endl;
    }

    return 0;
}

三、多层嵌套json数据获取

1、整体代码

复制代码
int parse_array()
{
    string jsonstr = R"(
        {
         "id":"2022",
         "name":{"EnglishName":"JackMa"},
         "title":[
          {
           "company":"taobao", 
           "position" : "AAA", 
           "salary" : "10000"
          },
          { 
           "company":"zhifubao",
           "position" : "CCC",
           "salary" : "890898" 
          },
          { 
           "company":"pingtouge",
           "position" : "KKK",
           "salary" : "76843" 
          }
         ]
        }
    )";

    //都放在try-catch语句里
    try
    {
        //先用一个parse方法得到json格式数据
        json_t jsonObj = json_t::parse(jsonstr);

        //嵌套的就层层获取
        //"name":{"EnglishName":"JackMa"},
        json_t nameJson = jsonObj["name"];
        string engName = nameJson["EnglishName"];
        cout << "engName = " << engName << endl;

        //多层嵌套就用for循环
        json_t titleJson = jsonObj["title"];
        int size = titleJson.size();
        cout << "size = " << size << endl;

        //for (int i = 0; i < size; i++)
        //{
        //    /*
        //    {
        //   "company":"taobao", 
        //   "position" : "AAA", 
        //   "salary" : "10000"
        //  },
        //    */
        //    cout << titleJson[i]["company"] << endl;
        //    cout << titleJson[i]["position"] << endl;
        //    cout << titleJson[i]["salary"] << endl;
        //}

        //智能索引
        for (auto jsonItem : titleJson)
        {
            cout << jsonItem["company"] << endl;
            cout << jsonItem["position"] << endl;
            cout << jsonItem["salary"] << endl;
        }
    }
    catch (const std::exception&)
    {
        return -1;
    }

    return 0;
}

2、for循环两种形式

复制代码
        for (int i = 0; i < size; i++)
        {
            /*
            {
           "company":"taobao", 
           "position" : "AAA", 
           "salary" : "10000"
          },
            */
            cout << titleJson[i]["company"] << endl;
            cout << titleJson[i]["position"] << endl;
            cout << titleJson[i]["salary"] << endl;
        }

        //智能索引
        //jsonItem 是一个自动推导的变量,会依次表示 titleJson 中的每个 JSON 对象。
        for (auto jsonItem : titleJson)
        {
            cout << jsonItem["company"] << endl;
            cout << jsonItem["position"] << endl;
            cout << jsonItem["salary"] << endl;
        }

以上就是Qt里nlohmann json库使用的简单介绍。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

相关推荐
AAIshangyanxiu8 分钟前
涡度通量碳观测数据 MATLAB 全流程解析与敏感性定量分析、观测数据质控、插补及 footprint 建模技术
开发语言·matlab·涡度通量·生态碳汇·生态碳汇模拟
小短腿乄15 分钟前
java实现pdf加水印+签名
java·开发语言·pdf
常乐か25 分钟前
在 Ubuntu 24.04 中编译 Qt 5.15.2 项目完全指南
linux·qt·ubuntu
聆风吟º37 分钟前
【金仓数据库征文】Java 应用接入金仓数据库:从驱动、连接池到存储过程调试的踩坑实录
java·开发语言·数据库
不会代码的小猴1 小时前
11. 类和动态内存分配
开发语言·c++
似璟如你2 小时前
Java 开发者的 Go 语法基础:从 0 开始快速上手 Go
java·开发语言·后端·golang·go·编程语言
LccKyI2 小时前
C#学习day05(开发福彩双色球系统附思维导图)
开发语言·学习·c#
zzz_23682 小时前
TencentDB-Agent-Memory 深度解析:让多个 Agent 共享项目经验的记忆中枢
java·开发语言·jvm·人工智能·agent·memory·tencent db
charlie1145141913 小时前
IMX6ULL WM8960 的移植——前置介绍
开发语言·c++·开源项目·嵌入式linux
迷迭香yy3 小时前
Python实战:涨停板“假封板”识别系统的工程实现
开发语言·人工智能·python