当前位置:   article > 正文

[C++] 使用 nlohmann 加载 json 内容_nlohmann使用 c++ std::vector使用

nlohmann使用 c++ std::vector使用

nlohmann 库是用来解析 json 的库,只有一个 json.hpp 文件, 个人比较喜欢用。

以下是我的使用方式

1.  json结点与结构体定义“一一对应”,并为每个结构体声明对应的 from_json 和 to_json 函数。

示例 json 说明:

       example 节点对应代码中的 stConfig 结构体. example ;子结点 fileAttribute 为一个数组对应结构体中的 vector 变量, 数组内容对应结构体 stArrayItem, 其内部还有一个字符串数组 localDir. 

  1. {
  2. "example": {
  3. "name": "example",
  4. "enable": false,
  5. "sockBufferSize": 204800,
  6. "fileAttribute": [
  7. {
  8. "deleteFile": false,
  9. "localDir": [
  10. "/mnt/d/Data/Dir1",
  11. "/mnt/d/Data/Dir2"
  12. ],
  13. "subDir": false
  14. }
  15. ]
  16. }
  17. }

  1. /*
  2. * example.h 文件
  3. */
  4. struct stArrayItem
  5. {
  6.     bool bSubDir = false
  7.     bool bDeleteFile = true
  8.     std::vector<std::string> vecLocalDir; 
  9. };
  10. // json 填充函数
  11. void from_json(const nlohmann::json &j, stArrayItem &v);
  12. void to_json(nlohmann::json &j, const stArrayItem &v);
  13. // 运行信息
  14. struct stConfig
  15. {
  16.     bool bEnable = false; // 链路可用
  17.     std::string strName;
  18.     // socket数据缓冲区大小
  19.     unsigned int uiSockBufferSize = 4096;
  20.     std::vector<stArrayItem> vecArray;
  21. };
  22. // json 填充函数
  23. void from_json(const nlohmann::json &j, stConfig &v);
  24. void to_json(nlohmann::json &j, const stConfig &v);

实现 json 的 填充和读取函数

  1. /*
  2. * example.cpp 文件
  3. */
  4. #include "example.h"
  5. //json 填充函数
  6. void from_json(const nlohmann::json& j, stArrayItem& v)
  7. {
  8.     j.at("deleteFile").get_to(v.bDeleteFile);
  9.     j.at("localDir").get_to(v.vecLocalDir);
  10.     if (j.contains("subDir"))
  11.     {
  12.         j.at("subDir").get_to(v.bSubDir);
  13.     }
  14. }
  15. void to_json(nlohmann::json& j, const stArrayItem& v)
  16. {
  17.     j = nlohmann::json{
  18.         {"deleteFile",v.bDeleteFile},
  19.         {"localDir",v.vecLocalDir},
  20.         {"subDir",v.bSubDir}
  21.     };
  22. }
  23. //json 填充函数
  24. void from_json(const nlohmann::json& j, stConfig& v)
  25. {
  26.     j.at("enable").get_to(v.bEnable);
  27.     j.at("name").get_to(v.strName);
  28.     j.at("sockBufferSize").get_to(v.uiSockBufferSize);
  29.     if (j.contains("fileAttribute"))
  30.     {
  31.         j.at("fileAttribute").get_to(v.vecArray);
  32.     }
  33. }
  34. void to_json(nlohmann::json& j, const stConfig& v)
  35. {
  36.     j = nlohmann::json{
  37.         {"enable",v.bEnable},
  38.         {"sockBufferSize",v.uiSockBufferSize},
  39.         {"name",v.strName},
  40.         {"fileAttribute",v.vecArray}
  41.     };
  42. }

json 文件解析文件时会自动调用对应的 from_json 函数。

  1. // 定义存储对象
  2. stConfig g_stConfigExample;
  3. /**
  4. * @brief loadCfgFile 从指定配置文件加载配置项
  5. * @author
  6. * @date
  7. * @param strCfgFilePath
  8. * @return bool
  9. */
  10. bool loadCfgFile(const std::string& strCfgFile)
  11. {
  12. LOGI("load Config file " + strCfgFile);
  13. std::ifstream jsonStream(strCfgFile);//打开文件,关联到流in
  14. if (!jsonStream.is_open())
  15. {
  16. return false;
  17. }
  18. nlohmann::json jsonCfg;
  19. jsonStream >> jsonCfg;
  20. jsonStream.close();
  21. std::string strTip;
  22. if (jsonCfg.contains("tip"))
  23. {
  24. jsonCfg["tip"].get_to(strTip);
  25. }
  26. if (jsonCfg.contains("example"))
  27. {
  28. jsonCfg["example"].get_to(g_stConfigExample);
  29. }
  30. return true;
  31. }

to_json 有时间再补

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/601185
推荐阅读
相关标签
  

闽ICP备14008679号