日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT中Json的使用方法(类和json字符串相互转换的方法)

發布時間:2024/1/1 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT中Json的使用方法(类和json字符串相互转换的方法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在QT5.0版本以后支持對Json的使用,直接使用QT提供的json類進行數據的組織和解析。

Json類介紹
QJsonDoucument它封裝了一個完整的 JSON 文檔,并且可以從 UTF-8 編碼的基于文本的表示以及 Qt 自己的二進制格式讀取和寫入該文檔。
QJsonArrayJSON 數組是一個值列表。可以通過從數組中插入和刪除 QJsonValue 來操作該列表。
QJsonObjectJSON 對象是鍵值對的列表,其中鍵是唯一的字符串,值由 QJsonValue 表示。
QJsonValue該類封裝了 JSON 支持的數據類型。

1. QJsonValue
在 Qt 中 QJsonValue 可以封裝的基礎數據類型有六種(和 Json 支持的類型一致),分別為:

布爾類型:QJsonValue::Bool
浮點類型(包括整形): QJsonValue::Double
字符串類型: QJsonValue::String
Json 數組類型: QJsonValue::Array
Json 對象類型:QJsonValue::Object
空值類型: QJsonValue::Null

如何存取數據呢?
存:
使用這個對象可以封裝這六種類型的數據:

// Json對象 QJsonValue(const QJsonObject &o); // Json數組 QJsonValue(const QJsonArray &a); // 字符串 QJsonValue(const char *s); QJsonValue(QLatin1String s); QJsonValue(const QString &s); // 整形 and 浮點型 QJsonValue(qint64 v); QJsonValue(int v); QJsonValue(double v); // 布爾類型 QJsonValue(bool b); // 空值類型 QJsonValue(QJsonValue::Type type = Null);

取:
使用相關的判斷函數判斷該數據的類型:

// 是否是Json數組 bool isArray() const; // 是否是Json對象 bool isObject() const; // 是否是布爾類型 bool isBool() const; // 是否是浮點類型(整形也是通過該函數判斷) bool isDouble() const; // 是否是空值類型 bool isNull() const; // 是否是字符串類型 bool isString() const; // 是否是未定義類型(無法識別的類型) bool isUndefined() const;

判斷出數據類型以后就可以轉換為實際的基礎數據類型

// 轉換為Json數組 QJsonArray toArray(const QJsonArray &defaultValue) const; QJsonArray toArray() const; // 轉換為布爾類型 bool toBool(bool defaultValue = false) const; // 轉換為浮點類型 double toDouble(double defaultValue = 0) const; // 轉換為整形 int toInt(int defaultValue = 0) const; // 轉換為Json對象 QJsonObject toObject(const QJsonObject &defaultValue) const; QJsonObject toObject() const; // 轉換為字符串類型 QString toString() const; QString toString(const QString &defaultValue) const;

2. QJsonObject

QJsonObject 封裝了 Json 中的對象,在里邊可以存儲多個鍵值對,為了方便操作,鍵值為字符串類型,值為 QJsonValue 類型。關于這個類的使用類似于 C++ 中的 STL 類,仔細閱讀 API 文檔即可熟練上手使用,下面介紹一些常用 API 函數:

如何創建空的 Json 對象

QJsonObject::QJsonObject(); // 構造空對象

將鍵值對添加到空對象中

iterator QJsonObject::insert(const QString &key, const QJsonValue &value);

獲取對象中鍵值對個數

int QJsonObject::count() const; int QJsonObject::size() const; int QJsonObject::length() const;

通過 key 得到 value

QJsonValue QJsonObject::value(const QString &key) const; // utf8 QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不支持中文 QJsonValue QJsonObject::operator[](const QString &key) const; QJsonValue QJsonObject::operator[](QLatin1String key) const;

刪除鍵值對

void QJsonObject::remove(const QString &key); QJsonValue QJsonObject::take(const QString &key); // 返回key對應的value值

通過key進行查找

iterator QJsonObject::find(const QString &key); bool QJsonObject::contains(const QString &key) const;

遍歷,方式有三種:

使用相關的迭代器函數

使用 [] 的方式遍歷,類似于遍歷數組,[] 中是鍵值

先得到對象中所有的鍵值,在遍歷鍵值列表,通過 key 得到 value 值

QStringList QJsonObject::keys() const;

3. QJsonArray

QJsonArray 封裝了 Json 中的數組,在里邊可以存儲多個元素,為了方便操作,所有的元素類統一為 QJsonValue 類型。也類似C++中的STL類。

創建空的 Json 數組

QJsonArray::QJsonArray();

添加數據

void QJsonArray::append(const QJsonValue &value); // 在尾部追加 void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前 iterator QJsonArray::insert(iterator before, const QJsonValue &value); void QJsonArray::prepend(const QJsonValue &value); // 添加到數組頭部 void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部 void QJsonArray::push_front(const QJsonValue &value); // 添加到頭部

計算數組元素的個數

int QJsonArray::count() const; int QJsonArray::size() const;

從數組中取出某一個元素的值

QJsonValue QJsonArray::at(int i) const; QJsonValue QJsonArray::first() const; // 頭部元素 QJsonValue QJsonArray::last() const; // 尾部元素 QJsonValueRef QJsonArray::operator[](int i);

刪除數組中的某一個元素

iterator QJsonArray::erase(iterator it); // 基于迭代器刪除 void QJsonArray::pop_back(); // 刪除尾部 void QJsonArray::pop_front(); // 刪除頭部 void QJsonArray::removeAt(int i); // 刪除i位置的元素 void QJsonArray::removeFirst(); // 刪除頭部 void QJsonArray::removeLast(); // 刪除尾部 QJsonValue QJsonArray::takeAt(int i); // 刪除i位置的原始, 并返回刪除的元素的值

Josn 數組的遍歷,常用的方式有兩種:

可以使用迭代器進行遍歷(和使用迭代器遍歷 STL 容器一樣)
可以使用數組的方式遍歷

4. QJsonDocument

它封裝了一個完整的 JSON 文檔,并且可以從 UTF-8 編碼的基于文本的表示以及 Qt 自己的二進制格式讀取和寫入該文檔。QJsonObject 和 QJsonArray 這兩個對象中的數據是不能直接轉換為字符串類型的,如果要進行數據傳輸或者數據的持久化,操作的都是字符串類型而不是 QJsonObject 或者 QJsonArray 類型,我們需要通過一個 Json 文檔類進行二者之間的轉換。

這就好比你所有的操作都完成,就差最后一步存儲到本地磁盤,那這一步怎么做呢?

下面依次介紹一下這兩個轉換流程應該如何操作:
(1)、創建 QJsonDocument 對象

QJsonDocument::QJsonDocument(const QJsonObject &object); QJsonDocument::QJsonDocument(const QJsonArray &array);

這個函數的作用就是將JSON數組和對象轉換成一個QJsonDocument對象。

(2)將文件對象中的數據進行序列化

// 二進制格式的json字符串 QByteArray QJsonDocument::toBinaryData() const; // 文本格式 QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;

再通過調用 toxxx() 方法就可以得到文本格式或者二進制格式的 Json 字符串了。

(3)使用得到的字符串進行數據傳輸,或者磁盤文件持久化

字符串 ===> QJsonObject 或者 QJsonArray

一般情況下,通過網絡通信或者讀磁盤文件就會得到一個 Json 格式的字符串,如果想要得到相關的原始數據就需要對字符串中的數據進行解析,具體解析流程如下:

(1)將得到的 Json 格式字符串通過 QJsonDocument 類的靜態函數轉換為 QJsonDocument 類對象

[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate); // 參數文件格式的json字符串 [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

(2)將文檔對象轉換為 json 數組 / 對象

// 判斷文檔對象中存儲的數據是不是數組 bool QJsonDocument::isArray() const; // 判斷文檔對象中存儲的數據是不是json對象 bool QJsonDocument::isObject() const// 文檔對象中的數據轉換為json對象 QJsonObject QJsonDocument::object() const; // 文檔對象中的數據轉換為json數組 QJsonArray QJsonDocument::array() const;

(3)通過調用 QJsonArray , QJsonObject 類提供的 API 讀出存儲在對象中的數據。

/**************************************************************************

Qt中處理json和cJSON

JSON是一種輕量級的數據交換格式。

那么如何在Qt中處理json?首先要知道四個類。

第一個類QJsonDocument;

  把JSON格式的字符串轉換成JSON對象/數組;或者把JSON對象/數組轉換成JSON格式字符串。

第二個類QJsonObject;

  處理Json對象,{? }

第三個類QJsonArray;

  處理Json數組,[]

第四個類QjsonValue;

  可以是字符串、整型、布爾、浮點、json對象、json數組...

1、組織JSON數據寫入磁盤

1 QJsonObject obj; //定義空對象2 QJsonObject sub;3 sub.insert("IP",QJsonValue("192.168.31.33"));//插入鍵值對4 sub.insert("Port",QJsonValue("9999"));5 obj.insert("server",QJsonValue(sub));6 7 QJsonDocument doc(obj);8 QByteArray data=doc.toJson();9 QFile file("tem1.json"); 10 file.open(QIODevice::WriteOnly); 11 file.write(data); 12 file.close();

server:{

    IP:192.168.31.33,

    Port:9999

    }

2、把磁盤中JSON數據加載到內存

1 QFile file("tem.json");2 file.open(QIODevice::ReadOnly);3 QByteArray data = file.readAll();4 file.close();5 6 QJsonDocument doc =QJsonDocument::fromJson(data);7 if(doc.isObject())8 {9 QJsonObject obj =doc .object(); 10 QJsonValue value=obj.value("server"); 11 if(value.isObject()) 12 { 13 QJsonObject sub=value.toObject(); 14 QString IP = sub.value("IP").toString(); 15 QString Port = sub.value("Port").toString(); 16 } 17 }

?  cJSON為我們提供一套操作json數據格式的API

  1、組織一個json數據格式的字符串寫入磁盤

//創建一個json數組 cJSON *cJSON_CreateArray(void); //創建一個json對象 cJSON *cJSON_CreateObject(void); //向json數組種添加數據成員 void cJSON_AddItemToArray(cJSON *array, cJSON *item);//往json對象中添加數據成員 void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); //把其他類型轉換成cjson* cJSON *cJSON_CreateNumber(double num); cJSON *cJSON_CreateString(const char *string);/* These utilities create an Array of count items. */ cJSON *cJSON_CreateIntArray(const int *numbers,int count); cJSON *cJSON_CreateFloatArray(const float *numbers,int count); cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); cJSON *cJSON_CreateStringArray(const char **strings,int count);

  一個小demo

1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<unistd.h>5 #include<sys/stat.h>6 #include<sys/types.h>7 #include"cJSON.h"8 int main()9 {10 //創建一個json對象11 cJSON *obj = cJSON_CreateObject();12 //創建一個子對象13 cJSON *subobj= cJSON_CreateObject();14 //往子對象中添加鍵值15 cJSON_AddItemToObject(subobj,"type",cJSON_CreateString("章回體古裝喜劇"));16 cJSON_AddItemToObject(subobj,"director",cJSON_CreateString("尚敬"));17 cJSON_AddItemToObject(subobj,"year",cJSON_CreateNumber(2006));18 cJSON *arry = cJSON_CreateArray();19 cJSON_AddItemToArray(arry,cJSON_CreateString("閆妮"));20 cJSON_AddItemToArray(arry,cJSON_CreateString("沙益"));21 cJSON_AddItemToArray(arry,cJSON_CreateString("姚晨"));22 cJSON_AddItemToArray(arry,cJSON_CreateString("喻恩泰"));23 cJSON_AddItemToArray(arry,cJSON_CreateNumber(123));24 25 cJSON *subsub = cJSON_CreateObject();26 cJSON_AddItemToObject(subsub,"天熱了睡涼席",cJSON_CreateString("天冷了加件衣"));27 cJSON_AddItemToArray(arry,subsub);28 cJSON_AddItemToObject(subobj,"other",arry);29 //往對象中添加鍵值對30 cJSON_AddItemToObject(obj,"武林外傳",subobj);31 //把json轉換成字符串,方便寫入磁盤32 char *data = cJSON_Print(obj);33 FILE *fd = fopen("cjson.cj","w");34 fwrite(data,1,strlen(data)+1,fd);35 fclose(fd);36 return 0;37 }

{"武林外傳": {"type": "章回體古裝喜劇","director": "尚敬","year": 2006,"other": ["閆妮", "沙益", "姚晨", "喻恩泰", 123, {"天熱了睡涼席": "天冷了加件衣"}] }

?  2、解析json,獲取值

//cJSON結構體typedef struct cJSON {struct cJSON *next,*prev; struct cJSON *child; int type; /*類型*/char *valuestring; /* The item's string, if type==cJSON_String */int valueint; /* The item's number, if type==cJSON_Number */double valuedouble; /* The item's number, if type==cJSON_Number */char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */} cJSON;//解析一個json字符串為cJSON對象 cJOSN * cJSON_Parse(const char*buf); //根據鍵查找值 cJSON * cJSON_GetObjectItem(cJSON*obj,const char *key);

  一個demo

void get_reg_info(char *reg_buf, char *user, char *pwd,char *email){/*json數據如下{userName:xxxx,firstPwd:xxx,email:xxx}*///解析json包 //解析一個json字符串為cJSON對象cJSON * root = cJSON_Parse(reg_buf);if(NULL == root){//出錯處理}//返回指定字符串對應的json對象//用戶cJSON *child1 = cJSON_GetObjectItem(root, "userName");if(NULL == child1){//出錯處理 }strcpy(user, child1->valuestring);cJSON *child2=cJSON_GetObjectItem(root,"fristPwd");if(NULL ==child2){}strcpy(pwd,child2->valuestring);cJSON *child2 = cJSON_GetObjectItem(root,"email");strcpy(email,child2->valuestring);cJSON_Delete(root); }

/***************************

把JSON轉成一個類對象(類與json字符串互轉)

  • {
  • "name": "布衣食",
  • "gender": "Male",
  • "age": 25,
  • "attribute": {
  • "skill": "Programming",
  • "languages": [ "C", "C++", "Java" ],
  • "frameworks": [ "Qt", "Android" ]
  • }
  • }
  • 我希望把它轉換為一個Programmer對象,Programmer的聲明如下

    Programmer.h

  • #ifndef PROGRAMMER_H
  • #define PROGRAMMER_H
  • #include <QString>
  • #include <QList>
  • class Programmer
  • {
  • public:
  • class Attribute
  • {
  • public:
  • Attribute(const QString &skill, const QList<QString> &languages, const QList<QString> &frameworks);
  • const QString &getSkill() const;
  • const QList<QString> &getLanguages() const;
  • const QList<QString> &getFrameworks() const;
  • private:
  • QString skill;
  • QList<QString> languages;
  • QList<QString> frameworks;
  • };
  • Programmer(const QString &name, const QString &gender, int age, Attribute attribute);
  • const QString &getName() const;
  • const QString &getGender() const;
  • int getAge() const;
  • const Attribute &getAttribute() const;
  • QString toJson() const;
  • static Programmer fromJson(const QString &json);
  • private:
  • QString name;
  • QString gender;
  • int age;
  • Attribute attribute;
  • };
  • #endif // PROGRAMMER_H
  • 在Java中,使用第三方庫GSON就可以方便地實現對象和json之間的轉換;而C++沒有反射機制,所以沒有類似的庫。

    于是,我只好自行編寫轉換代碼,如下

    將json轉換為Programmer對象

  • Programmer Programmer::fromJson(const QString &json)
  • {
  • QJsonParseError error;
  • const QJsonDocument &document = QJsonDocument::fromJson(json.toUtf8(), &error);
  • if (QJsonParseError::NoError == error.error)
  • {
  • const QJsonObject &programmerObject = document.object();
  • const QString &name = programmerObject.value(QStringLiteral("name")).toString();
  • const QString &gender = programmerObject.value(QStringLiteral("gender")).toString();
  • int age = programmerObject.value(QStringLiteral("age")).toInt();
  • const QJsonObject &attributeObject = programmerObject.value(QStringLiteral("attribute")).toObject();
  • const QString &skill = attributeObject.value(QStringLiteral("skill")).toString();
  • const QJsonArray &languagesArray = attributeObject.value(QStringLiteral("languages")).toArray();
  • QList<QString> languages;
  • for (const QJsonValue &value : languagesArray)
  • {
  • languages.append(value.toString());
  • }
  • const QJsonArray &frameworksArray = attributeObject.value(QStringLiteral("frameworks")).toArray();
  • QList<QString> frameworks;
  • for (const QJsonValue &value : frameworksArray)
  • {
  • frameworks.append(value.toString());
  • }
  • return Programmer(name, gender, age, Attribute(skill, languages, frameworks));
  • }
  • throw error.errorString();
  • }
  • 將Programmer對象轉換為json

  • QString Programmer::toJson() const
  • {
  • QJsonObject programmerObject;
  • programmerObject.insert(QStringLiteral("name"), name);
  • programmerObject.insert(QStringLiteral("gender"), gender);
  • programmerObject.insert(QStringLiteral("age"), age);
  • QJsonObject attributeObject;
  • attributeObject.insert(QStringLiteral("skill"), attribute.getSkill());
  • QJsonArray languagesArray;
  • for (const QString &s : attribute.getLanguages())
  • {
  • languagesArray.append(s);
  • }
  • attributeObject.insert(QStringLiteral("languages"), languagesArray);
  • QJsonArray frameworksArray;
  • for (const QString &s : attribute.getFrameworks())
  • {
  • frameworksArray.append(s);
  • }
  • attributeObject.insert(QStringLiteral("frameworks"), frameworksArray);
  • programmerObject.insert(QStringLiteral("attribute"), attributeObject);
  • return QJsonDocument(programmerObject).toJson();
  • }
  • 編寫這樣的代碼,枯燥費時,但我目前沒有更好的解決方案。

    總結

    以上是生活随笔為你收集整理的QT中Json的使用方法(类和json字符串相互转换的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。