qtjson转结构体方法怎么操作?Qt中JSON如何生成与解析?

JSON是一种轻量级的数据交换格式,在Qt库中,为JSON的相关操作提供了完整的类支持,那qtjson转结构体方法是什么?下面来我们就来给大家讲解一下qtjson转结构体方法。

{
    "name": "C 加加"
    , "master": 2020
    , "members": [
    {
        "id": 1
        , "name": "xiaohua"
        , "mail": "xiaohua@qq.com"
}
    , {
        "id": 2
        , "name": "xiaohe"
        , "mail": "xiaohe@qq.com"
}]
    , "hobby":
    {
        "id": 1
        , "hname": "xiaohuahua"
        , "hdesc": "xiaohuahua@qq.com"
    }
}
Qt_C++ ++JSON 转结构体代码说明#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "jsontest.h"
#include "x2struct/x2struct.hpp" // 此库需要下载然后包含到项目中
#include
#include
#include
using namespace std;
// 定义数组嵌套的 json
struct User
{
    int id;
    string name;
    string mail;
    User(int i = 0
            , const string & n = ""
                , const string & m = ""):
        id(i), name(n), mail(m)
        {}
    XTOSTRUCT(O(id, name, mail));
};
// 定义内层嵌套 json
struct Hobby
{
    int id;
    string hname;
    string hdesc;
    Hobby(int hi = 0
            , const string & hn = ""
                , const string & hd = ""):
        id(hi), hname(hn), hdesc(hd)
        {}
    XTOSTRUCT(O(id, hname, hdesc));
};
// 定以外层 json
struct Group
{
    string name;
    int master;
    vector members;
    Hobby hobby;
    XTOSTRUCT(O(name, master, members, hobby)); // 此处不要忘记添加,我在此处犯错了
};
MainWindow::MainWindow(QWidget * parent): QMainWindow(parent)
    , ui(new Ui::MainWindow)
    {
        ui - > setupUi(this);
        Group g;
        g.name = "C 加加";
        g.master = 2020;
        g.members.resize(2);
        g.members[0] = User(1, "xiaohua", "xiaohua@qq.com");
        g.members[1] = User(2, "xiaohe", "xiaohe@qq.com");
        g.hobby = Hobby(1, "xiaohuahua", "xiaohuahua@qq.com");
        // g.hobbyMap.clear();
        // g.hobbyMap["hobby"] = Hobby(1, "xiaohuahua", "xiaohuahua@qq.com");
        string json = x2struct::X::tojson(g);
        cout <
            // Group n;
            // x2struct::X::loadjson(json, n, false);
            // for(auto nitem : n.members)
            // {
            // cout << nitem.id << endl;
            // cout << nitem.name <
            // cout << nitem.mail <
            // }
            // xstruct x;
            // // struct string
            // cout< string ==========="<
            // X::loadjson("test.json", x, true); // load json from file, if from string, last parameter give false
            // cout<<:tojson struct to string.>
            // // map string
            // cout< string ==========="<
            // string smap = "{\"a\":1, \"b\":2}";
            // map m;
            // X::loadjson(smap, m, false);
            // cout<<:tojson>
            // // vector string
            // cout< string ==========="<
            // string svector = "[1, 2, 3]";
            // vector v;
            // X::loadjson(svector, v, false);
            // cout<<:tojson>
    }
MainWindow::~MainWindow()
{
    delete ui;
}

Qt_C++++JSON 转结构体最终实现效果。

Qt中JSON如何生成与解析?

QJsonDocument

QJsonDocument既可以从一个基于文本表示的UTF-8编码,又可以从Qt自己的二进制格式读取和写入这个文件。

JSON文档可以从它的基于文本的表示使用QJsonDocument::fromJson()转换为QJsonDocument,用.toJSON()将其转换回文字。解析器非常快速和高效,将JSON转换为二进制表示。

QJsonObject

QJsonObject类用于封装JSON对象。

JSON对象是键值对,其中键是唯一的字符串,其值由QJsonValue代表。一个QJsonObject可以从QVariantMap转换/被转换。

QJsonArray

QJsonArray类用于封装JSON数组。

一个JSON数组列表值。该列表可以通过从阵列插入和移除QJsonValue的操纵。一个QJsonArray可以从QVariantList转换为/被转换。

QJsonDocument有效解析后的文档可以使用!iSNull()判断。使用isArray()和isObject()来判断是否包含一个数组或对象。文档中包含的数组或对象可以使用array()或object()进行检索,然后读取或操纵。

示例

QJsonObject

(1)生成Json

QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

结果:

json_str:{“name”: “Qt”,”version”: 5,”windows”: true}

(2)解析Json

QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, & json_error);
if (json_error.error == QJsonParseError::NoError)
{
    if (parse_doucment.isObject())
    {
        QJsonObject obj = parse_doucment.object();
        if (obj.contains("name"))
        {
            QJsonValue name_value = obj.take("name");
            if (name_value.isString())
            {
                QString name = name_value.toString();
                qDebug() << name;
            }
        }
        if (obj.contains("version"))
        {
            QJsonValue version_value = obj.take("version");
            if (version_value.isDouble())
            {
                int version = version_value.toVariant()
                    .toInt();
                qDebug() << version;
            }
        }
        if (obj.contains("windows"))
        {
            QJsonValue version_value = obj.take("windows");
            if (version_value.isBool())
            {
                bool flag = version_value.toBool();
                qDebug() << flag;
            }
        }
    }
}

QJsonArray

(1)生成Json

QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

结果:

json_str:[“Qt”,”version”,true]

(2)解析Json

QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, & json_error);
if (json_error.error == QJsonParseError::NoError)
{
    if (parse_doucment.isArray())
    {
        QJsonArray array = parse_doucment.array();
        int size = array.size();
        for (int i = 0; i
            {
                qDebug() << i << ":";
                QJsonValue value = array.at(i);
                if (value.isString())
                {
                    QString name = value.toString();
                    qDebug() << name;
                }
                else if (value.isBool())
                {
                    bool flag = value.toBool();
                    qDebug() << flag;
                }
            }
        }
    }

结果:**

数组不同下标对应的值

0 :
“Qt”
1 :
“version”
2 :
true

Qt中JSON的生成与解析是实际开发中经常遇到的,所以作为java人员,一定要多研究并学会使用。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

javabean组件提交表单的代码怎么写?如何处理表单数据?

java泛型方法怎么写?为什么用java泛型?

如何用java做一个网站?Java做网站有哪些技术?