JSON是一种简单的轻量级数据交换格式,Qt库为JSON的相关操作提供了完整的类支持,使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJsonDocument等库对该JSON格式进行解析,以提取出我们所需字段。

首先创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下:

  1. {
  2. "blog": "https://www.cnblogs.com/lyshark",
  3. "enable": true,
  4. "status": 1024,
  5. "GetDict": {"address":"192.168.1.1","username":"root","password":"123456","update":"2020-09-26"},
  6. "GetList": [1,2,3,4,5,6,7,8,9,0],
  7. "ObjectInArrayJson":
  8. {
  9. "One": ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
  10. "Two": ["Sunday","Monday","Tuesday"]
  11. },
  12. "ArrayJson": [
  13. ["192.168.1.1","root","22"],
  14. ["192.168.1.2","root","23"],
  15. ["192.168.1.3","root","24"],
  16. ["192.168.1.4","root","25"],
  17. ["192.168.1.5","root","26"]
  18. ],
  19. "ObjectJson": [
  20. {"address":"192.168.1.1","username":"admin"},
  21. {"address":"192.168.1.2","username":"root"},
  22. {"address":"192.168.1.3","username":"lyshark"}
  23. ]
  24. }

首先实现读写文本文件,通过QT中封装的<QFile>库可实现对文本文件的读取操作,读取JSON文件可使用该方式.

  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QTextStream>
  5. #include <QFile>
  6. #include <QDir>
  7. #include <QFileInfo>
  8. #include <QJsonDocument>
  9. #include <QJsonParseError>
  10. #include <QJsonObject>
  11. #include <QJsonArray>
  12. #include <QJsonValue>
  13. #include <QJsonValueRef>
  14. // 传入文本路径,读取并输出
  15. int readonly_string_file(QString file_path)
  16. {
  17. QFile this_file_ptr(file_path);
  18. // 判断文件是否存在
  19. if(false == this_file_ptr.exists())
  20. {
  21. std::cout << "文件不存在" << std::endl;
  22. return 0;
  23. }
  24. /*
  25. * 文件打开属性包括如下
  26. * QIODevice::ReadOnly 只读方式打开
  27. * QIODevice::WriteOnly 写入方式打开
  28. * QIODevice::ReadWrite 读写方式打开
  29. * QIODevice::Append 追加方式打开
  30. * QIODevice::Truncate 截取方式打开
  31. * QIODevice::Text 文本方式打开
  32. */
  33. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  34. {
  35. std::cout << "打开失败" << std::endl;
  36. return 0;
  37. }
  38. // 读取到文本中的字符串
  39. QString string_value = this_file_ptr.readAll();
  40. std::cout << "读入长度: " << this_file_ptr.size() << std::endl;
  41. std::cout << "字符串: " << string_value.toStdString() << std::endl;
  42. this_file_ptr.close();
  43. }
  44. // 逐行读取文本文件
  45. // PowerBy: www.cnblogs.com/lyshark
  46. void read_line_file()
  47. {
  48. QFile this_file_ptr("d:/config.json");
  49. if(this_file_ptr.open((QIODevice::ReadOnly | QIODevice::Text)))
  50. {
  51. QByteArray byte_array;
  52. while(false == this_file_ptr.atEnd())
  53. {
  54. byte_array += this_file_ptr.readLine();
  55. }
  56. std::cout << "完整文本: " << QString(byte_array).toStdString() << std::endl;
  57. this_file_ptr.close();
  58. }
  59. }
  60. // 传入文本路径与写入内容,写入到文件
  61. void write_string_file(QString file_path, QString string_value)
  62. {
  63. QFile this_file_ptr(file_path);
  64. // 判断文件是否存在
  65. if(false == this_file_ptr.exists())
  66. {
  67. return;
  68. }
  69. // 打开失败
  70. if(false == this_file_ptr.open(QIODevice::ReadWrite | QIODevice::Text))
  71. {
  72. return;
  73. }
  74. //写入内容,注意需要转码,否则会报错
  75. QByteArray write_string = string_value.toUtf8();
  76. //写入QByteArray格式字符串
  77. this_file_ptr.write(write_string);
  78. this_file_ptr.close();
  79. }
  80. // 计算文件或目录大小
  81. // PowerBy: www.cnblogs.com/lyshark
  82. unsigned int GetFileSize(QString path)
  83. {
  84. QFileInfo info(path);
  85. unsigned int ret = 0;
  86. if(info.isFile())
  87. {
  88. ret = info.size();
  89. }
  90. else if(info.isDir())
  91. {
  92. QDir dir(path);
  93. QFileInfoList list = dir.entryInfoList();
  94. for(int i = 0; i < list.count(); i++)
  95. {
  96. if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
  97. {
  98. ret += GetFileSize(list[i].absoluteFilePath());
  99. }
  100. }
  101. }
  102. return ret;
  103. }
  104. int main(int argc, char *argv[])
  105. {
  106. QCoreApplication a(argc, argv);
  107. // 读取文件
  108. readonly_string_file("d:/config.json");
  109. // 计算文件或目录大小
  110. unsigned int file_size = GetFileSize("d:/xunjian");
  111. std::cout << "获取文件或目录大小: " << file_size << std::endl;
  112. // 覆盖写入文件
  113. QString write_file_path = "d:/test.json";
  114. QString write_string = "hello lyshark";
  115. write_string_file(write_file_path,write_string);
  116. return a.exec();
  117. }

实现解析根对象中的单一键值对,例如解析配置文件中的blog,enable,status等这些独立的字段值.

  1. // 读取JSON文本
  2. // PowerBy: www.cnblogs.com/lyshark
  3. QString readonly_string(QString file_path)
  4. {
  5. QFile this_file_ptr(file_path);
  6. if(false == this_file_ptr.exists())
  7. {
  8. return "None";
  9. }
  10. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  11. {
  12. return "None";
  13. }
  14. QString string_value = this_file_ptr.readAll();
  15. this_file_ptr.close();
  16. return string_value;
  17. }
  18. int main(int argc, char *argv[])
  19. {
  20. QCoreApplication a(argc, argv);
  21. // 读取文件
  22. QString config = readonly_string("d:/config.json");
  23. if(config == "None")
  24. {
  25. return 0;
  26. }
  27. // 字符串格式化为JSON
  28. QJsonParseError err_rpt;
  29. QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  30. if(err_rpt.error != QJsonParseError::NoError)
  31. {
  32. std::cout << "JSON格式错误" << std::endl;
  33. return 0;
  34. }
  35. // 获取到Json字符串的根节点
  36. QJsonObject root_object = root_document.object();
  37. // 解析blog字段
  38. QString blog = root_object.find("blog").value().toString();
  39. std::cout << "字段对应的值 = > "<< blog.toStdString() << std::endl;
  40. // 解析enable字段
  41. bool enable = root_object.find("enable").value().toBool();
  42. std::cout << "是否开启状态: " << enable << std::endl;
  43. // 解析status字段
  44. int status = root_object.find("status").value().toInt();
  45. std::cout << "状态数值: " << status << std::endl;
  46. return a.exec();
  47. }

实现解析简单的单对象单数组结构,如上配置文件中的GetDictGetList既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4. QFile this_file_ptr(file_path);
  5. if(false == this_file_ptr.exists())
  6. {
  7. return "None";
  8. }
  9. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10. {
  11. return "None";
  12. }
  13. QString string_value = this_file_ptr.readAll();
  14. this_file_ptr.close();
  15. return string_value;
  16. }
  17. // PowerBy: www.cnblogs.com/lyshark
  18. int main(int argc, char *argv[])
  19. {
  20. QCoreApplication a(argc, argv);
  21. // 读取文件
  22. QString config = readonly_string("d:/config.json");
  23. if(config == "None")
  24. {
  25. return 0;
  26. }
  27. // 字符串格式化为JSON
  28. QJsonParseError err_rpt;
  29. QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  30. if(err_rpt.error != QJsonParseError::NoError)
  31. {
  32. std::cout << "JSON格式错误" << std::endl;
  33. return 0;
  34. }
  35. // 获取到Json字符串的根节点
  36. QJsonObject root_object = root_document.object();
  37. // 解析单一对象
  38. // PowerBy: www.cnblogs.com/lyshark
  39. QJsonObject get_dict_ptr = root_object.find("GetDict").value().toObject();
  40. QVariantMap map = get_dict_ptr.toVariantMap();
  41. if(map.contains("address") && map.contains("username") && map.contains("password") && map.contains("update"))
  42. {
  43. QString address = map["address"].toString();
  44. QString username = map["username"].toString();
  45. QString password = map["password"].toString();
  46. QString update = map["update"].toString();
  47. std::cout
  48. << " 地址: " << address.toStdString()
  49. << " 用户名: " << username.toStdString()
  50. << " 密码: " << password.toStdString()
  51. << " 更新日期: " << update.toStdString()
  52. << std::endl;
  53. }
  54. // 解析单一数组
  55. QJsonArray get_list_ptr = root_object.find("GetList").value().toArray();
  56. for(int index=0; index < get_list_ptr.count(); index++)
  57. {
  58. int ref_value = get_list_ptr.at(index).toInt();
  59. std::cout << "输出数组元素: " << ref_value << std::endl;
  60. }
  61. return a.exec();
  62. }

实现解析对象嵌套对象对象中嵌套数组结构,如上配置文件中的ObjectInArrayJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. QString readonly_string(QString file_path)
  3. {
  4. QFile this_file_ptr(file_path);
  5. if(false == this_file_ptr.exists())
  6. {
  7. return "None";
  8. }
  9. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  10. {
  11. return "None";
  12. }
  13. QString string_value = this_file_ptr.readAll();
  14. this_file_ptr.close();
  15. return string_value;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19. QCoreApplication a(argc, argv);
  20. // 读取文件
  21. QString config = readonly_string("d:/config.json");
  22. if(config == "None")
  23. {
  24. return 0;
  25. }
  26. // 字符串格式化为JSON
  27. // PowerBy: www.cnblogs.com/lyshark
  28. QJsonParseError err_rpt;
  29. QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  30. if(err_rpt.error != QJsonParseError::NoError)
  31. {
  32. std::cout << "JSON格式错误" << std::endl;
  33. return 0;
  34. }
  35. // 获取到Json字符串的根节点
  36. QJsonObject root_object = root_document.object();
  37. // 找到Object对象
  38. QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject();
  39. // 转为MAP映射
  40. QVariantMap map = one_object_json.toVariantMap();
  41. // 寻找One键
  42. QJsonArray array_one = map["One"].toJsonArray();
  43. for(int index=0; index < array_one.count(); index++)
  44. {
  45. QString value = array_one.at(index).toString();
  46. std::cout << "One => "<< value.toStdString() << std::endl;
  47. }
  48. // 寻找Two键
  49. QJsonArray array_two = map["Two"].toJsonArray();
  50. for(int index=0; index < array_two.count(); index++)
  51. {
  52. QString value = array_two.at(index).toString();
  53. std::cout << "Two => "<< value.toStdString() << std::endl;
  54. }
  55. return a.exec();
  56. }

实现解析数组中的数组结构,如上配置文件中的ArrayJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. // PowerBy: www.cnblogs.com/lyshark
  3. QString readonly_string(QString file_path)
  4. {
  5. QFile this_file_ptr(file_path);
  6. if(false == this_file_ptr.exists())
  7. {
  8. return "None";
  9. }
  10. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  11. {
  12. return "None";
  13. }
  14. QString string_value = this_file_ptr.readAll();
  15. this_file_ptr.close();
  16. return string_value;
  17. }
  18. int main(int argc, char *argv[])
  19. {
  20. QCoreApplication a(argc, argv);
  21. // 读取文件
  22. QString config = readonly_string("d:/config.json");
  23. if(config == "None")
  24. {
  25. return 0;
  26. }
  27. // 字符串格式化为JSON
  28. QJsonParseError err_rpt;
  29. QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  30. if(err_rpt.error != QJsonParseError::NoError)
  31. {
  32. std::cout << "json 格式错误" << std::endl;
  33. return 0;
  34. }
  35. // 获取到Json字符串的根节点
  36. QJsonObject root_object = root_document.object();
  37. // 获取MyJson数组
  38. QJsonValue array_value = root_object.value("ArrayJson");
  39. // 验证节点是否为数组
  40. if(array_value.isArray())
  41. {
  42. // 得到数组个数
  43. int array_count = array_value.toArray().count();
  44. // 循环数组个数
  45. for(int index=0;index <= array_count;index++)
  46. {
  47. QJsonValue parset = array_value.toArray().at((index));
  48. if(parset.isArray())
  49. {
  50. QString address = parset.toArray().at(0).toString();
  51. QString username = parset.toArray().at(1).toString();
  52. QString userport = parset.toArray().at(2).toString();
  53. std::cout
  54. << "地址: " << address.toStdString()
  55. << " 用户名: " << username.toStdString()
  56. << " 端口号: " << userport.toStdString()
  57. << std::endl;
  58. }
  59. }
  60. }
  61. return a.exec();
  62. }

实现解析数组中的多对象结构,如上配置文件中的ObjectJson既是我们需要解析的内容.

  1. // 读取JSON文本
  2. // PowerBy: www.cnblogs.com/lyshark
  3. QString readonly_string(QString file_path)
  4. {
  5. QFile this_file_ptr(file_path);
  6. if(false == this_file_ptr.exists())
  7. {
  8. return "None";
  9. }
  10. if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
  11. {
  12. return "None";
  13. }
  14. QString string_value = this_file_ptr.readAll();
  15. this_file_ptr.close();
  16. return string_value;
  17. }
  18. int main(int argc, char *argv[])
  19. {
  20. QCoreApplication a(argc, argv);
  21. // 读取文件
  22. QString config = readonly_string("d:/config.json");
  23. if(config == "None")
  24. {
  25. return 0;
  26. }
  27. // 字符串格式化为JSON
  28. QJsonParseError err_rpt;
  29. QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
  30. if(err_rpt.error != QJsonParseError::NoError)
  31. {
  32. std::cout << "json 格式错误" << std::endl;
  33. return 0;
  34. }
  35. // 获取到Json字符串的根节点
  36. QJsonObject root_object = root_document.object();
  37. // 获取MyJson数组
  38. QJsonValue object_value = root_object.value("ObjectJson");
  39. // 验证是否为数组
  40. // PowerBy: www.cnblogs.com/lyshark
  41. if(object_value.isArray())
  42. {
  43. // 获取对象个数
  44. int object_count = object_value.toArray().count();
  45. // 循环个数
  46. for(int index=0;index <= object_count;index++)
  47. {
  48. QJsonObject obj = object_value.toArray().at(index).toObject();
  49. // 验证数组不为空
  50. if(!obj.isEmpty())
  51. {
  52. QString address = obj.value("address").toString();
  53. QString username = obj.value("username").toString();
  54. std::cout << "地址: " << address.toStdString() << " 用户: " << username.toStdString() << std::endl;
  55. }
  56. }
  57. }
  58. return a.exec();
  59. }

C/C++ Qt 运用JSON解析库 [基础篇]的更多相关文章

  1. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  2. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  3. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

  4. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  5. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  6. C++的Json解析库:jsoncpp和boost

    C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...

  7. C++的Json解析库:jsoncpp和boost(转)

    原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...

  8. 常用json解析库比较及选择 fastjson & gson

    一.常用json解析库比较及选择 1.简介 fastjson和gson是目前比较常用的json解析库,并且现在我们项目代码中,也在使用这两个解析库. fastjson 是由阿里开发的,号称是处理jso ...

  9. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

随机推荐

  1. Spring Boot中使用Servlet与Filter

    在Spring Boot中使用Servlet,根据Servlet注册方式的不同,有两种使用方式.若使用的是Servlet3.0+版本,则两种方式均可使用:若使用的是Servlet2.5版本,则只能使用 ...

  2. 商城项目的购物车模块的实现------通过session实现

    1.新建购物车的实体类Cart public class Cart implements java.io.Serializable{ private Shangpin shangpin;//存放商品实 ...

  3. 【Matlab】快速傅里叶变换/ FFT/ fftshift/ fftshift(fft(fftshift(s)))

    [自我理解] fft:可以指定点数的快速傅里叶变换 fftshift:将零频点移到频谱的中间 用法: Y=fftshift(X) Y=fftshift(X,dim) 描述:fftshift移动零频点到 ...

  4. UIWindow介绍

    1.作为容器,包含app所要显示的所有视图 3.与UIViewController协同工作,方便完成设备方向旋转的支持 1.addSubview 2.rootViewController 三.Wind ...

  5. C# VS 调试报错:未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项

    今天在使用 VS(VisualStudio) 调试一个复杂的 WinForm 程序,总是提示错误: 未能加载文件或程序集"Newtonsoft.Json, Version=4.5.0.0, ...

  6. Log4j2 消停了,Logback 开始塌房了?

    今天一早,还没起床,拿起手机赫然看到一个头条信息,标题着实让我心理咯噔了一下! 马上起床,直奔官网,看看到底什么问题?塌的有多厉害? 既然是1.2.9版本以下问题,那就直接找到1.2.9版本修复了些啥 ...

  7. JAVA获得websocket请求路径前缀

    /** * 获得websocket请求路径前缀(线程安全 速度相对慢) * @param request * @return */ public static String getWebsocketU ...

  8. 页面调用百度地图但是使用了https证书之后不显示

    首先百度地图使用的都是http请求链接,但是安装了证书之后会觉得这个http不安全,所以默认请求失败 这时候我们在请求头添加 <meta http-equiv="Content-Sec ...

  9. 【LeetCode】5686. 移动所有球到每个盒子所需的最小操作数 Minimum Number of Operations to Move All Balls to Each Box

    作者: 负雪明烛 id: fuxuemingzhu 公众号:负雪明烛 本文关键词:LeetCode,力扣,算法,算法题,交替合并字符串,Merge Strings Alternately,刷题群 目录 ...

  10. 【九度OJ】题目1201:二叉排序树 解题报告

    [九度OJ]题目1201:二叉排序树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1201 题目描述: 输入一系列整数,建立二叉排序 ...