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

相关推荐
ZhongruiRao4 小时前
Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据
spring boot·postgresql·json
华农第一蒟蒻5 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
胡耀超6 小时前
知识图谱入门——8: KG开发常见数据格式:OWL、RDF、XML、GraphML、JSON、CSV。
xml·json·知识图谱·csv·owl·graphml·gml
x-cmd10 小时前
[241005] 14 款最佳免费开源图像处理库 | PostgreSQL 17 正式发布
数据库·图像处理·sql·安全·postgresql·开源·json
先知demons17 小时前
js将对象的键和值分别归纳进对象,并将多层对象转化成数据的方法
javascript·vue.js·json
Midsummer啦啦啦1 天前
Python字符串转JSON格式指南
开发语言·python·json
前端 贾公子1 天前
Express内置的中间件(express.json和express.urlencoded)格式的请求体数据
中间件·json·express
迷失蒲公英2 天前
在线JSON可视化工具--支持缩放
json·在线json可视化·在线json格式化
bug菌¹3 天前
滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用
数据库·mysql·json·全文索引
GDAL4 天前
Efficiently Convert Shapefiles to Protocol Buffers and JSON with Shp2pb
json