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

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

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

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

#include <QCoreApplication>
#include <iostream>
#include <QString>
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QFileInfo> #include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonValueRef> // 传入文本路径,读取并输出
int readonly_string_file(QString file_path)
{
QFile this_file_ptr(file_path); // 判断文件是否存在
if(false == this_file_ptr.exists())
{
std::cout << "文件不存在" << std::endl;
return 0;
} /*
* 文件打开属性包括如下
* QIODevice::ReadOnly 只读方式打开
* QIODevice::WriteOnly 写入方式打开
* QIODevice::ReadWrite 读写方式打开
* QIODevice::Append 追加方式打开
* QIODevice::Truncate 截取方式打开
* QIODevice::Text 文本方式打开
*/ if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
std::cout << "打开失败" << std::endl;
return 0;
} // 读取到文本中的字符串
QString string_value = this_file_ptr.readAll(); std::cout << "读入长度: " << this_file_ptr.size() << std::endl;
std::cout << "字符串: " << string_value.toStdString() << std::endl;
this_file_ptr.close();
} // 逐行读取文本文件
// PowerBy: www.cnblogs.com/lyshark
void read_line_file()
{
QFile this_file_ptr("d:/config.json"); if(this_file_ptr.open((QIODevice::ReadOnly | QIODevice::Text)))
{
QByteArray byte_array; while(false == this_file_ptr.atEnd())
{
byte_array += this_file_ptr.readLine();
} std::cout << "完整文本: " << QString(byte_array).toStdString() << std::endl;
this_file_ptr.close();
}
} // 传入文本路径与写入内容,写入到文件
void write_string_file(QString file_path, QString string_value)
{
QFile this_file_ptr(file_path); // 判断文件是否存在
if(false == this_file_ptr.exists())
{
return;
} // 打开失败
if(false == this_file_ptr.open(QIODevice::ReadWrite | QIODevice::Text))
{
return;
} //写入内容,注意需要转码,否则会报错
QByteArray write_string = string_value.toUtf8(); //写入QByteArray格式字符串
this_file_ptr.write(write_string);
this_file_ptr.close();
} // 计算文件或目录大小
// PowerBy: www.cnblogs.com/lyshark
unsigned int GetFileSize(QString path)
{
QFileInfo info(path);
unsigned int ret = 0;
if(info.isFile())
{
ret = info.size();
}
else if(info.isDir())
{
QDir dir(path);
QFileInfoList list = dir.entryInfoList();
for(int i = 0; i < list.count(); i++)
{
if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
{
ret += GetFileSize(list[i].absoluteFilePath());
}
}
}
return ret;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
readonly_string_file("d:/config.json"); // 计算文件或目录大小
unsigned int file_size = GetFileSize("d:/xunjian");
std::cout << "获取文件或目录大小: " << file_size << std::endl; // 覆盖写入文件
QString write_file_path = "d:/test.json";
QString write_string = "hello lyshark";
write_string_file(write_file_path,write_string); return a.exec();
}

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

// 读取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
QFile this_file_ptr(file_path);
if(false == this_file_ptr.exists())
{
return "None";
}
if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
return "None";
}
QString string_value = this_file_ptr.readAll();
this_file_ptr.close();
return string_value;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
QString config = readonly_string("d:/config.json");
if(config == "None")
{
return 0;
} // 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
std::cout << "JSON格式错误" << std::endl;
return 0;
} // 获取到Json字符串的根节点
QJsonObject root_object = root_document.object(); // 解析blog字段
QString blog = root_object.find("blog").value().toString();
std::cout << "字段对应的值 = > "<< blog.toStdString() << std::endl; // 解析enable字段
bool enable = root_object.find("enable").value().toBool();
std::cout << "是否开启状态: " << enable << std::endl; // 解析status字段
int status = root_object.find("status").value().toInt();
std::cout << "状态数值: " << status << std::endl; return a.exec();
}

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

// 读取JSON文本
QString readonly_string(QString file_path)
{
QFile this_file_ptr(file_path);
if(false == this_file_ptr.exists())
{
return "None";
}
if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
return "None";
}
QString string_value = this_file_ptr.readAll();
this_file_ptr.close();
return string_value;
}
// PowerBy: www.cnblogs.com/lyshark
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
QString config = readonly_string("d:/config.json");
if(config == "None")
{
return 0;
} // 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
std::cout << "JSON格式错误" << std::endl;
return 0;
} // 获取到Json字符串的根节点
QJsonObject root_object = root_document.object(); // 解析单一对象
// PowerBy: www.cnblogs.com/lyshark
QJsonObject get_dict_ptr = root_object.find("GetDict").value().toObject();
QVariantMap map = get_dict_ptr.toVariantMap(); if(map.contains("address") && map.contains("username") && map.contains("password") && map.contains("update"))
{
QString address = map["address"].toString();
QString username = map["username"].toString();
QString password = map["password"].toString();
QString update = map["update"].toString(); std::cout
<< " 地址: " << address.toStdString()
<< " 用户名: " << username.toStdString()
<< " 密码: " << password.toStdString()
<< " 更新日期: " << update.toStdString()
<< std::endl;
} // 解析单一数组
QJsonArray get_list_ptr = root_object.find("GetList").value().toArray(); for(int index=0; index < get_list_ptr.count(); index++)
{
int ref_value = get_list_ptr.at(index).toInt();
std::cout << "输出数组元素: " << ref_value << std::endl;
} return a.exec();
}

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

// 读取JSON文本
QString readonly_string(QString file_path)
{
QFile this_file_ptr(file_path);
if(false == this_file_ptr.exists())
{
return "None";
}
if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
return "None";
}
QString string_value = this_file_ptr.readAll();
this_file_ptr.close();
return string_value;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
QString config = readonly_string("d:/config.json");
if(config == "None")
{
return 0;
} // 字符串格式化为JSON
// PowerBy: www.cnblogs.com/lyshark
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
std::cout << "JSON格式错误" << std::endl;
return 0;
} // 获取到Json字符串的根节点
QJsonObject root_object = root_document.object(); // 找到Object对象
QJsonObject one_object_json = root_object.find("ObjectInArrayJson").value().toObject(); // 转为MAP映射
QVariantMap map = one_object_json.toVariantMap(); // 寻找One键
QJsonArray array_one = map["One"].toJsonArray(); for(int index=0; index < array_one.count(); index++)
{
QString value = array_one.at(index).toString(); std::cout << "One => "<< value.toStdString() << std::endl;
} // 寻找Two键
QJsonArray array_two = map["Two"].toJsonArray(); for(int index=0; index < array_two.count(); index++)
{
QString value = array_two.at(index).toString(); std::cout << "Two => "<< value.toStdString() << std::endl;
} return a.exec();
}

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

// 读取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
QFile this_file_ptr(file_path);
if(false == this_file_ptr.exists())
{
return "None";
}
if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
return "None";
}
QString string_value = this_file_ptr.readAll();
this_file_ptr.close();
return string_value;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
QString config = readonly_string("d:/config.json");
if(config == "None")
{
return 0;
} // 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
std::cout << "json 格式错误" << std::endl;
return 0;
} // 获取到Json字符串的根节点
QJsonObject root_object = root_document.object(); // 获取MyJson数组
QJsonValue array_value = root_object.value("ArrayJson"); // 验证节点是否为数组
if(array_value.isArray())
{
// 得到数组个数
int array_count = array_value.toArray().count(); // 循环数组个数
for(int index=0;index <= array_count;index++)
{
QJsonValue parset = array_value.toArray().at((index));
if(parset.isArray())
{
QString address = parset.toArray().at(0).toString();
QString username = parset.toArray().at(1).toString();
QString userport = parset.toArray().at(2).toString(); std::cout
<< "地址: " << address.toStdString()
<< " 用户名: " << username.toStdString()
<< " 端口号: " << userport.toStdString()
<< std::endl;
}
}
} return a.exec();
}

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

// 读取JSON文本
// PowerBy: www.cnblogs.com/lyshark
QString readonly_string(QString file_path)
{
QFile this_file_ptr(file_path);
if(false == this_file_ptr.exists())
{
return "None";
}
if(false == this_file_ptr.open(QIODevice::ReadOnly | QIODevice::Text))
{
return "None";
}
QString string_value = this_file_ptr.readAll();
this_file_ptr.close();
return string_value;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 读取文件
QString config = readonly_string("d:/config.json");
if(config == "None")
{
return 0;
} // 字符串格式化为JSON
QJsonParseError err_rpt;
QJsonDocument root_document = QJsonDocument::fromJson(config.toUtf8(), &err_rpt);
if(err_rpt.error != QJsonParseError::NoError)
{
std::cout << "json 格式错误" << std::endl;
return 0;
} // 获取到Json字符串的根节点
QJsonObject root_object = root_document.object(); // 获取MyJson数组
QJsonValue object_value = root_object.value("ObjectJson"); // 验证是否为数组
// PowerBy: www.cnblogs.com/lyshark
if(object_value.isArray())
{
// 获取对象个数
int object_count = object_value.toArray().count(); // 循环个数
for(int index=0;index <= object_count;index++)
{
QJsonObject obj = object_value.toArray().at(index).toObject(); // 验证数组不为空
if(!obj.isEmpty())
{
QString address = obj.value("address").toString();
QString username = obj.value("username").toString(); std::cout << "地址: " << address.toStdString() << " 用户: " << username.toStdString() << std::endl;
}
}
} return a.exec();
}

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. vue 第三方图标库

    "font-awesome": "^4.7.0", "dependencies": { "axios": "^ ...

  2. 【Word】自动化参考文献-交叉引用

    第一步:设置参考文献标号 开始-定义新编号格式中,定义参考文献式的方框编号: 这里注意不要把他原来的数字去掉 第二步:选择交叉引用 插入-交叉引用: 第三步:更新标号 如果更新标号,使用右键-更新域. ...

  3. Jsp/servlet分页五要素

    分页5要素: * 1)pageIndex 当前页 * 2)startIndex 从第几条数据开始 * 3)countAll 总条目数 * 4)pageSize 每页大小 * 5)pageCount 总 ...

  4. Android工具 - 随机测试(猴子)

    原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6697535 本文章的前提:已经安装了Eclipse和ADT.androi ...

  5. Latex-安装_第一天

    LaTex安装 Windows 小知识: \(Tex\)来源technology,希腊词根是\(tex\),Latex应该读成"拉泰赫". https://miktex.org/ ...

  6. secret_file

    拿到题目例行检查,进入main函数 这个逆向有些复杂,程序首先让我们像dest输入256个字符,我们可以看到关键的strcmp(v15,v17),若相等则执行poppen poppen这个函数有额外的 ...

  7. [BUUCTF]PWN——others_babystack

    others_babystack 附件 步骤: 例行检查,64位程序,开了挺多保护 本地试运行一下程序 64位ida载入,看main函数 1是read函数,存在栈溢出:2是puts函数,3退出 利用思 ...

  8. matplotlib模块详解

    简单绘图,折线图,并保存为图片 import matplotlib.pyplot as plt x=[1,2,3,4,5] y=[10,5,15,10,20] plt.plot(x,y,'ro-',c ...

  9. 使用批处理文件(.bat)启动多个CMD窗口并执行命令

    由于每次启动本机的kafka都需要打开2个cmd窗口,分别启动zookeeper服务和kafka服务,操作相对繁琐,于是想起了批处理来帮忙一键启动. 在桌面新建一个txt文件,改后缀名为.bat,并加 ...

  10. CF670A Holidays 题解

    Content 假设 \(1\) 年有 \(n\) 天,而每周同样会有 \(5\) 天工作日和 \(2\) 天休假.求一年最小的休假天数和最大休假天数. 数据范围:\(1\leqslant n\leq ...