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

概述: Qt中使用Json比较方便,不像纯C++需要导入CJson RapidJson JsonCpp等第三方的库,主要使用到QJsonDocument、QJsonObject对象即可

1、如何构造一个json字符串

        假如我们需要构造 {"cmd":"1001","data":{"content":"05:00","type":1}} 这样的json串,在Qt中应该这样编写代码

main.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

#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

#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

#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();
}

2.1带数组的json数据构造

void test_json2()
{
    //带数组的json数据构造
    auto jsonStr = "{\"cmd\":\"1001\",\"data\":{\"content\":\"05:00\",\"type\":1,\"ips\":\
                    [{\"ip\":\"192.168.1.1\",\"port\":10000},\
                    {\"ip\":\"192.168.1.3\",\"port\":10002}]\
                    }}";
    
    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;

    QVariantMap ipsMap;
    
    QVariantList ipsList;
    
    QVariantMap ip1;
    ip1["ip"] = "192.168.1.1";
    ip1["port"] = 10000;

    QVariantMap ip2;
    ip2["ip"] = "192.168.1.1";
    ip2["port"] = 10001;
    
    ipsList.append(ip1);
    ipsList.append(ip2);
    
    ipsMap["ips"] = ipsList;
    
    contentMap["data"] = dataMap;

    CcJsonTool jsonTool;
    auto str = jsonTool.toJsonFromVariantMap(contentMap);

    qDebug() << "jsonStr:" << str;
}

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

CcQtApp: Qt测试demo

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果理解正确的话,您的需求是在 JSON 数据,根据同级元素的某个属性值搜索同级元素。可以使用 Qt 提供的 Json 类库和 STL 的算法库实现。 假设您的 JSON 数据结构如下: ```json { "data": [ { "name": "Alice", "age": 20, "gender": "female" }, { "name": "Bob", "age": 25, "gender": "male" }, { "name": "Charlie", "age": 30, "gender": "male" } ] } ``` 现在,您需要根据某个元素的属性值搜索同级元素。假设您需要根据 `name` 属性值搜索同级元素,可以使用以下代码实现: ```cpp #include <QJsonDocument> #include <QFile> #include <QDebug> #include <algorithm> int main(int argc, char *argv[]) { Q_UNUSED(argc) Q_UNUSED(argv) // 读取 JSON 数据 QFile file(":/data.json"); file.open(QIODevice::ReadOnly | QIODevice::Text); QString json = file.readAll(); file.close(); // 解析 JSON 数据 QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error); if (error.error != QJsonParseError::NoError) { qWarning() << "Failed to parse JSON data:" << error.errorString(); return -1; } // 获取同级元素列表 QJsonArray array = doc.object()["data"].toArray(); // 搜索同级元素 QString searchName = "Bob"; auto it = std::find_if(array.begin(), array.end(), [=](const QJsonValue &value){ return value.toObject()["name"].toString() == searchName; }); // 输出搜索结果 if (it != array.end()) { qDebug() << "Found same-level element:" << it->toObject(); } else { qDebug() << "Cannot find same-level element with name:" << searchName; } return 0; } ``` 在这个例子,我们使用了 STL 的 `std::find_if` 算法,通过一个 lambda 表达式来实现搜索条件。如果找到了符合条件的元素,则返回该元素的迭代器,否则返回同级元素列表的 `end()` 迭代器。最后,我们输出搜索结果。 需要注意的是,如果您需要搜索的属性值是一个复杂类型(例如嵌套的 JSON 对象或数组),则需要在 lambda 表达式进行递归搜索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值