Qt 中Json的构造和解析简单例子

概述: 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();
}

3、参考gitee仓库上的测试源码

CcQtApp: Qt测试demo

相关推荐
ChoSeitaku7 小时前
NO.4|protobuf网络版通讯录|httplib|JSON、XML、ProtoBuf对比
xml·json
青衫客368 小时前
浅谈 Java 后端对象映射:从 JSON → VO → Entity 的原理与实践
java·json
qqxhb17 小时前
11|结构化输出:为什么 JSON 能让系统更稳定
json·ai编程·结构化·规范模板
小黑要努力1 天前
json-c安装以及amixer使用
linux·运维·json
听风者一号1 天前
cssMoudle生成器
前端·javascript·json
ID_180079054732 天前
小红书笔记详情 API 接口系列 + 标准 JSON 返回参考(完整版)
数据库·笔记·json
小狗丹尼4002 天前
JSON 基础认知、数据转换与 Flask 前后端交互全解
python·flask·json
奔跑的呱呱牛3 天前
arcgis-to-geojson双向转换工具库
arcgis·json
武超杰3 天前
SpringMVC核心功能详解:从RESTful到JSON数据处理
后端·json·restful
还是大剑师兰特4 天前
Vue3 前端专属配置(VSCode settings.json + .prettierrc)
前端·vscode·json