概述: Qt中使用Json比较方便,不像纯C++需要导入CJson RapidJson JsonCpp等第三方的库,主要使用到QJsonDocument、QJsonObject对象即可
1、如何构造一个json字符串
假如我们需要构造 {"cmd":"1001","data":{"content":"05:00","type":1}} 这样的json串,在Qt中应该这样编写代码
main.cpp
cpp
#include <QApplication>
#include <QWidget>
#include <QDebug>
//cc-tools里面生成的动态库
#include "CcJsonTool.h"
int main(int argc, char *argv[])
{
auto cmd = 1001;
auto type = 1;
auto content = "05:00";
QVariantMap contentMap;
contentMap["cmd"] = QString::number(cmd);
QVariantMap dataMap;
dataMap["type"] = type;
dataMap["content"] = content;
contentMap["data"] = dataMap;
//使用工具构建
CcJsonTool jsonTool;
auto str = jsonTool.toJsonFromVariantMap(contentMap);
qDebug() << "jsonStr:" << str;
}
CcJsonTool.h
cpp
#pragma once
#include "cc_tools_global_config.h"
#include <QString>
#include <QObject>
#include <QVariantMap>
class CCTOOLS_EXPORT CcJsonTool : public QObject
{
Q_OBJECT
public:
CcJsonTool(QObject* parent = nullptr);
~CcJsonTool();
QString toJsonFromVariantMap(QVariantMap dataMap);
bool ParseJsonFromString(const QString& jsonData);
};
CcJsonTool.cpp
cpp
#include "CcJsonTool.h"
#include <QJsonDocument>
#include <QJsonObject>
CcJsonTool::CcJsonTool(QObject* parent)
:QObject(parent)
{
}
CcJsonTool::~CcJsonTool()
{
}
QString CcJsonTool::toJsonFromVariantMap(QVariantMap dataMap)
{
// dataMap: {"cmd":"1001","data":{"content":"05:00","type":1}}
QByteArray command = QJsonDocument(QJsonObject::fromVariantMap(dataMap)).toJson(QJsonDocument::Compact);
return QString::fromUtf8(command);
}
bool CcJsonTool::parseJsonFromString(const QString& jsonData)
{
// jsonData: {"cmd":"1001","data":{"content":"05:00","type":1}}
QJsonParseError error;
auto jsonDoc = QJsonDocument::fromJson(jsonData.toUtf8(), &error);
if (error.error != QJsonParseError::NoError)
{
return false;
}
auto mapContent = jsonDoc.object().toVariantMap();
if (!mapContent.contains("cmd") || !mapContent.contains("data"))
{
return false;
}
auto mapData = mapContent["data"].toMap();
if (!mapData.contains("content"))
{
return false;
}
auto cmd = mapContent["cmd"].toString().toUInt();
if (cmd == 1001)
{
auto type = mapData["type"].toInt();
auto content = mapData["content"];
}
return true;
}
2、解析一个Json字符串
main.cpp
cpp
#include <QApplication>
#include <QWidget>
#include <QDebug>
//cc-tools里面生成的动态库
#include "CcJsonTool.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//jsonStr
auto JsonStr = "{\"cmd\":\"1001\",\"data\":{\"content\":\"05:00\",\"type\":1}}";
if (jsonTool.parseJsonFromString(JsonStr))
{
qDebug() << "parse json str success";
}
else
{
qDebug() << "parse json str failed";
}
return app.exec();
}