QT中Json的使用方法(类和json字符串相互转换的方法)
在QT5.0版本以后支持對Json的使用,直接使用QT提供的json類進行數據的組織和解析。
| QJsonDoucument | 它封裝了一個完整的 JSON 文檔,并且可以從 UTF-8 編碼的基于文本的表示以及 Qt 自己的二進制格式讀取和寫入該文檔。 |
| QJsonArray | JSON 數組是一個值列表。可以通過從數組中插入和刪除 QJsonValue 來操作該列表。 |
| QJsonObject | JSON 對象是鍵值對的列表,其中鍵是唯一的字符串,值由 QJsonValue 表示。 |
| QJsonValue | 該類封裝了 JSON 支持的數據類型。 |
1. QJsonValue
在 Qt 中 QJsonValue 可以封裝的基礎數據類型有六種(和 Json 支持的類型一致),分別為:
布爾類型:QJsonValue::Bool
浮點類型(包括整形): QJsonValue::Double
字符串類型: QJsonValue::String
Json 數組類型: QJsonValue::Array
Json 對象類型:QJsonValue::Object
空值類型: QJsonValue::Null
如何存取數據呢?
存:
使用這個對象可以封裝這六種類型的數據:
取:
使用相關的判斷函數判斷該數據的類型:
判斷出數據類型以后就可以轉換為實際的基礎數據類型
// 轉換為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 對象
這個函數的作用就是將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字符串互轉)
我希望把它轉換為一個Programmer對象,Programmer的聲明如下
Programmer.h
在Java中,使用第三方庫GSON就可以方便地實現對象和json之間的轉換;而C++沒有反射機制,所以沒有類似的庫。
于是,我只好自行編寫轉換代碼,如下
將json轉換為Programmer對象
將Programmer對象轉換為json
編寫這樣的代碼,枯燥費時,但我目前沒有更好的解決方案。
總結
以上是生活随笔為你收集整理的QT中Json的使用方法(类和json字符串相互转换的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV图像特征提取学习四,SIFT
- 下一篇: s3c2440移植MQTT