• 【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,直接放到项目中即可使用

    1. #include
    2. #include "json.hpp"
    3. #include
    4. //取别名方便下面使用
    5. using json_t = nlohmann::json;
    6. using namespace std;

    2、具体思路

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

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

    1. // 序列化,把json数据转成string
    2. string _rawdata = jRawdata.dump();
    3. cout << _rawdata << endl;
    2.3parse方法反序列化 
    1. // 反序列化,把string数据转成json
    2. string json_str = R"(
    3. {
    4. "date": "20220701",
    5. "level": 1,
    6. "msg": "register account",
    7. "status": "success",
    8. "username": "jackli"
    9. }
    10. )";
    11. try
    12. {
    13. //关键的parse方法
    14. json_t j2 = json_t::parse(json_str);
    15. string date = j2["date"];
    16. cout << date << endl;
    17. }
    2.4异常的catch参数 
    catch (std::exception& e){}

    3、整体代码

    1. int main()
    2. {
    3. //如果是没有多层嵌套的看一下怎么拿到
    4. json_t jRawdata; //定义一个json对象
    5. jRawdata["username"] = "jackli";
    6. jRawdata["pwd"] = "123456";
    7. // 序列化,把json数据转成string
    8. string _rawdata = jRawdata.dump();
    9. cout << _rawdata << endl;
    10. // 反序列化,把string数据转成json
    11. string json_str = R"(
    12. {
    13. "date": "20220701",
    14. "level": 1,
    15. "msg": "register account",
    16. "status": "success",
    17. "username": "jackli"
    18. }
    19. )";
    20. try
    21. {
    22. //关键的parse方法
    23. json_t j2 = json_t::parse(json_str);
    24. string date = j2["date"];
    25. cout << date << endl;
    26. }
    27. catch (std::exception& e)
    28. {
    29. cout << "json parse failed" << endl;
    30. return -1;
    31. }
    32. cout << "解析json数组" << endl;
    33. if (parse_array() != 0)
    34. {
    35. cout << "parse array failed" << endl;
    36. }
    37. return 0;
    38. }

    三、多层嵌套json数据获取 

    1、整体代码

    1. int parse_array()
    2. {
    3. string jsonstr = R"(
    4. {
    5. "id":"2022",
    6. "name":{"EnglishName":"JackMa"},
    7. "title":[
    8. {
    9. "company":"taobao",
    10. "position" : "AAA",
    11. "salary" : "10000"
    12. },
    13. {
    14. "company":"zhifubao",
    15. "position" : "CCC",
    16. "salary" : "890898"
    17. },
    18. {
    19. "company":"pingtouge",
    20. "position" : "KKK",
    21. "salary" : "76843"
    22. }
    23. ]
    24. }
    25. )";
    26. //都放在try-catch语句里
    27. try
    28. {
    29. //先用一个parse方法得到json格式数据
    30. json_t jsonObj = json_t::parse(jsonstr);
    31. //嵌套的就层层获取
    32. //"name":{"EnglishName":"JackMa"},
    33. json_t nameJson = jsonObj["name"];
    34. string engName = nameJson["EnglishName"];
    35. cout << "engName = " << engName << endl;
    36. //多层嵌套就用for循环
    37. json_t titleJson = jsonObj["title"];
    38. int size = titleJson.size();
    39. cout << "size = " << size << endl;
    40. //for (int i = 0; i < size; i++)
    41. //{
    42. // /*
    43. // {
    44. // "company":"taobao",
    45. // "position" : "AAA",
    46. // "salary" : "10000"
    47. // },
    48. // */
    49. // cout << titleJson[i]["company"] << endl;
    50. // cout << titleJson[i]["position"] << endl;
    51. // cout << titleJson[i]["salary"] << endl;
    52. //}
    53. //智能索引
    54. for (auto jsonItem : titleJson)
    55. {
    56. cout << jsonItem["company"] << endl;
    57. cout << jsonItem["position"] << endl;
    58. cout << jsonItem["salary"] << endl;
    59. }
    60. }
    61. catch (const std::exception&)
    62. {
    63. return -1;
    64. }
    65. return 0;
    66. }

    2、for循环两种形式 

    1. for (int i = 0; i < size; i++)
    2. {
    3. /*
    4. {
    5. "company":"taobao",
    6. "position" : "AAA",
    7. "salary" : "10000"
    8. },
    9. */
    10. cout << titleJson[i]["company"] << endl;
    11. cout << titleJson[i]["position"] << endl;
    12. cout << titleJson[i]["salary"] << endl;
    13. }
    1. //智能索引
    2. //jsonItem 是一个自动推导的变量,会依次表示 titleJson 中的每个 JSON 对象。
    3. for (auto jsonItem : titleJson)
    4. {
    5. cout << jsonItem["company"] << endl;
    6. cout << jsonItem["position"] << endl;
    7. cout << jsonItem["salary"] << endl;
    8. }

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

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

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

  • 相关阅读:
    说明白正反向代理,以及Nginx和Gunicorn
    Centos下使用containerd管理容器:5分钟从docker转型到containerd
    大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
    git命令合并某一个分支的某个commit到目标分支
    深度学习-nlp系列(5)文本实体识别(LSTM)pytorch
    MySQL数据库期末考试试题及参考答案(09)
    计算机毕业设计Python+Django的学生作业管理系统
    两个小球的动态展示,在窗口中绘制了两个小球。小球的位置和速度会随着时间的推移而改变,当它们触碰到窗口的边界时会反弹
    自学之路Flutter使用Provider进行状态管理
    Python【控制台输出案例2】
  • 原文地址:https://blog.csdn.net/LF__plus/article/details/138074579