本文摘自:https://blog.csdn.net/liang19890820/article/details/52767153
因为最近在使用mqtt做数据的收发用到json,linux arm中因为使用了cjson的第三方库做了解析,比较简单。
但是具体的在PC端使用的Qt进行的客户端的编写,而qt是自带json的数据解析库的,所以,需要简单的研究下,摘过这篇博客,并做加入一点自己的笔记。
简述
Qt5 中包含了处理 JSON 的类,均以 QJson 开头(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模块中,不需要额外引入其它模块。
- 常用的JSON库
json.org 中介绍了 JSON 在各种语言中的应用,在 C/C++ 中比较常用的JSON 库主要有以下几个:
JsonCpp
JsonCpp 是一个 C++ 用来处理 JSON 数据的开发包。
网址:http://jsoncpp.sourceforge.net/
cJSON
cJSON 是一个超轻巧,携带方便,单文件,简单的可以作为 ANSI-C 标准的 JSON 解析器。
网址:http://sourceforge.net/projects/cjson/
QJson
QJson 是一个基于 Qt 的开发包用来将 JSON 数据解析成 QVariant 对象,JSON 的数组将被映射为QVariantList 实例,而其他对象映射为 QVariantMap 实例。
网址:http://qjson.sourceforge.net/
关于 Qt 中对 JSON 的生成与解析,Qt5 以前的版本,可以使用 QJson 库,需要单独下载、编译,才能使用。到了 Qt5,提供了专门的 QJsonDocument 及其相关类来读和写 JSON 文档。
//组成json对象
QJsonObject json1;
json1.insert("name", "111");
json1.insert("pass", 222);
json1.insert("flout", 33.33);
QJsonDocument doc;
doc.setObject(json1);
QByteArray byte = doc.toJson(QJsonDocument::Compact);
qDebug()<<byte;
//解析json对象
QJsonParseError error;
doc = QJsonDocument::fromJson(byte, &error);
if(error.error == QJsonParseError::NoError)
{
if(doc.isObject())
{
QJsonObject obj = doc.object();
if(obj.contains("name")){//字符串的解析
QJsonValue value = obj.value("name");
if(value.isString()){
QString strname = value.toString();
qDebug()<< strname;
}
}
if(obj.contains("pass")){
QJsonValue value = obj.value("pass");
if(value.isDouble()){//整型的解析
int n_pass = value.toVariant().toInt();
qDebug()<<n_pass;
}
}
if(obj.contains("flout")){
QJsonValue value = obj.value("flout");
if(value.isDouble()){//double的解析
double n_pass = value.toDouble();
qDebug()<<n_pass;
}
}
}
}
QJsonArray versionArray;
versionArray.append(4.8);
versionArray.append(5.2);
versionArray.append(5.7);
// 构建 Json 对象 - Page
QJsonObject pageObject;
pageObject.insert("Home", "https://www.qt.io/");
pageObject.insert("Download", "https://www.qt.io/download/");
pageObject.insert("Developers", "https://www.qt.io/developers/");
// 构建 Json 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("Company", "Digia");
json.insert("From", 1991);
json.insert("Version", QJsonValue(versionArray));
json.insert("Page", QJsonValue(pageObject));
// 构建 Json 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
qDebug() << strJson;
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError); // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { // 解析未发生错误
if (doucment.isObject()) { // JSON 文档为对象
QJsonObject object = doucment.object(); // 转化为对象
if (object.contains("Name")) {
QJsonValue value = object.value("Name");
if (value.isString()) {
QString strName = value.toString();
qDebug() << "Name : " << strName;
}
}
if (object.contains("Company")) {
QJsonValue value = object.value("Company");
if (value.isString()) {
QString strCompany = value.toString();
qDebug() << "Company : " << strCompany;
}
}
if (object.contains("From")) {
QJsonValue value = object.value("From");
if (value.isDouble()) {
int nFrom = value.toVariant().toInt();
qDebug() << "From : " << nFrom;
}
}
if (object.contains("Version")) {
QJsonValue value = object.value("Version");
if (value.isArray()) { // Version 的 value 是数组
QJsonArray array = value.toArray();
int nSize = array.size();
for (int i = 0; i < nSize; ++i) {
QJsonValue value = array.at(i);
if (value.isDouble()) {
double dVersion = value.toDouble();
qDebug() << "Version : " << dVersion;
}
}
}
}
if (object.contains("Page")) {
QJsonValue value = object.value("Page");
if (value.isObject()) { // Page 的 value 是对象
QJsonObject obj = value.toObject();
if (obj.contains("Home")) {
QJsonValue value = obj.value("Home");
if (value.isString()) {
QString strHome = value.toString();
qDebug() << "Home : " << strHome;
}
}
if (obj.contains("Download")) {
QJsonValue value = obj.value("Download");
if (value.isString()) {
QString strDownload = value.toString();
qDebug() << "Download : " << strDownload;
}
}
if (obj.contains("Developers")) {
QJsonValue value = obj.value("Developers");
if (value.isString()) {
QString strDevelopers = value.toString();
qDebug() << "Developers : " << strDevelopers;
}
}
}
}
}
}
QString与QJOSN的相互转化
例子一:
QJsonObject MainWindow::QstringToJson(QString jsonString)
{
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toLocal8Bit().data());
if(jsonDocument.isNull())
{
qDebug()<< "String NULL"<< jsonString.toLocal8Bit().data();
}
QJsonObject jsonObject = jsonDocument.object();
return jsonObject;
}
QString MainWindow::JsonToQstring(QJsonObject jsonObject)
{
return QString(QJsonDocument(jsonObject).toJson());
}
例子二:
//QString转QJsonObject
QJsonObject convertQStringToQJsonObject(const QString jsonString)
{
QTextCodec *tc = QTextCodec::codecForName("UTF-8");//防止中文乱码
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data());
if (jsonDocument.isNull()){
g_pInterface->iDataPrintf("数据解析有误"); //判断是否解析出问题
}
QJsonObject jsonObject = jsonDocument.object();
return jsonObject;
}
//QJson转QString
QString convertQJsonObjectToQString(const QJsonObject& jsonObject)
{
return QString(QJsonDocument(jsonObject).toJson());
}