柚子快報(bào)邀請(qǐng)碼778899分享:Qt天氣預(yù)報(bào)系統(tǒng)之JSON
柚子快報(bào)邀請(qǐng)碼778899分享:Qt天氣預(yù)報(bào)系統(tǒng)之JSON
1、什么是JSON?
JSON(JavaScript Object Notation)是一種輕量級(jí)的、通用的數(shù)據(jù)格式,可供各式各樣的客戶(hù)端和服務(wù)端進(jìn)行通信;
JSON本質(zhì)上是一種特殊格式的字符串
它有以下特點(diǎn):
便于閱讀書(shū)寫(xiě)
? ? ? ? 除了JSON格式,還有一種數(shù)據(jù)傳輸格式XML(Qt的ui文件就是XML格式);相對(duì)于XML,JSON更加利于閱讀
獨(dú)立于編程語(yǔ)言
? ? ? ? 幾乎在所有的編程語(yǔ)言和開(kāi)發(fā)環(huán)境中,都有解析和生成JSON字符串的庫(kù)
# C
Jansson,cJSON
# C++
jsonCpp,JSON for Modern C++
# Java
json-lib,org-json
# Android
Gson FastJson
# Qt
QJsonXxx
網(wǎng)絡(luò)傳輸?shù)臉?biāo)準(zhǔn)格式
? ? ? ? 基于以上特點(diǎn),JSON成為了網(wǎng)絡(luò)傳輸使用率最高的數(shù)據(jù)格式
2、JSON的兩種數(shù)據(jù)格式
JSON有兩種數(shù)據(jù)格式
JSON對(duì)象JSON數(shù)組
規(guī)則:被大括號(hào)包裹的是JSON對(duì)象;被中括號(hào)包裹的是JSON數(shù)組
2.1 JSON數(shù)組
JSON數(shù)組格式
[元素1,元素2,元素3,...,元素n]
?此處的元素可以是不同的數(shù)據(jù)類(lèi)型,包括:整形、浮點(diǎn)、字符串、布爾、JSON數(shù)組、JSON對(duì)象、空值
[ 1,2.5,“hello”,true,null ]
?JSON數(shù)組嵌套
[
? ? ? ? [ 1,2,3 ],
? ? ? ? [ "hello","my","baby" ],
? ? ? ? [ 1,2.5,“hello”,true,null ]
]
JSON數(shù)組嵌套對(duì)象
[
? ? ? ? {
? ? ? ? ? ? ? ? "name" : "Tom",
? ? ? ? ? ? ? ? "age" : 18
????????}
????????{
? ? ? ? ? ? ? ? "name" : "Jim",
? ? ? ? ? ? ? ? "age"? ?: 19
????????}
]?
?2.2 JSON對(duì)象
JSON對(duì)象格式:
{
? ? ? ? "key1" : value1,
????????"key2" : value2,
????????"key3" : value3
}
?鍵key是標(biāo)準(zhǔn)的字符串類(lèi)型,值value可以是:整形、浮點(diǎn)、字符串、布爾、JSON數(shù)組、JSON對(duì)象、空值
{ ?? ?"name": "China", ?? ?"info": { ?? ??? ?"capital": "beijing ", ?? ??? ?"asian": true, ?? ??? ?"founded": 1949 ?? ?}, ?? ?"provinces": [{ ?? ??? ??? ?"name": "shandong ", ?? ??? ??? ?"capital": "jinan" ?? ??? ?}, ?? ??? ?{ ?? ??? ??? ?"name": "guangdong ", ?? ??? ??? ?"capital": "guangzhou" ?? ??? ?} ?? ?] }
2.3 JSON的在線(xiàn)解析
JSON在線(xiàn)解析工具1
JSON在線(xiàn)解析工具2
3、Qt中使用JSON?
3.1JSON相關(guān)的類(lèi)
QJsonObjectQJsonArrayQJsonValueQJsonDocument
?(1)QJsonObject
QJsonObject封裝了JSON中的對(duì)象,可以存儲(chǔ)多個(gè)鍵值對(duì)。
其中鍵為字符串類(lèi)型,值為QJsonValue類(lèi)型
創(chuàng)建一個(gè)QJsonObject對(duì)象
QJsonObject::QJsonObject();
將鍵值添加到QJsonObject對(duì)象中
QJsonObject::iterator insert(const QString &key,const QJsonValue &value);
獲取QJsonObject對(duì)象中的鍵值對(duì)個(gè)數(shù)
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
通過(guò)key獲得value的值
QJsonValue QJsonObject::value(const QString &key) const;
QJsonValue QJsonObject::operator[](const QString &key) const;
檢查key是否存在
iterator QJsonObject::find(const QString &key);
boll QJsonObject::contains(const QString &key) const;
遍歷key?
QStringList QJsonObject::keys() const;
(2)QJsonArray
?創(chuàng)建一個(gè)QJsonArray
QJsonArray::QJsonArray();
添加數(shù)組元素
//添加到頭部和尾部
void QJsonArray::append(const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value);
//插入到i的位置之前
void QJsonArray::insert(int i,const QJsonValue &value);
//添加到頭部和尾部
void QJsonArray::push_front(const QJsonValue &value);
void QJsonArray::push_back(const QJsonValue &value);
獲取QJsonArray元素個(gè)數(shù)
int QJsonArray::count() const;
int QJsonArray::size() const;
獲取元素的值
//獲取頭部和尾部的值
QJsonValue QJsonArray::first() const;
QJsonValue QJsonArray::last() const;
//獲取指定位置的值
QJsonValue QJsonArray::at(int i) const;
QJsonValueRef QJsonArray::operator[](int i);
刪除元素
//刪除頭部和尾部
void QJsonArray::pop_front(;
void QJsonArray::pop_back();
void QJsonArray::removeFirst();
void QJsonArray::removeLast();
//刪除指定位置
void QJsonArray::removeAt(int i);
QJsonValue QJsonArray::takeAt(int i);
(3)QJsonValue
封裝了6種數(shù)據(jù)類(lèi)型
# 布爾
QJsonValue::Bool
# 浮點(diǎn)類(lèi)型(包括整形)
QJsonValue::Double
# 字符串類(lèi)型
QJsonValue::String
# Json數(shù)組類(lèi)型
QJsonValue::Array
# Json對(duì)象類(lèi)型
QJsonValue::Object
# 空值類(lèi)型
QJsonValue::Null
通過(guò)以下方式來(lái)構(gòu)造QJsonValue對(duì)象
字符串
QJsonValue(const char *s);
QJsonValue(QLatinlString s);
QJsonValue(const QString &s);
整形or浮點(diǎn)型
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);
布爾
QJsonValue(bool b);
Json對(duì)象
QJsonValue(const QJsonObject &o);
Json數(shù)組
QJsonValue(const QJsonArray &a);
空值類(lèi)型
QJsonValue(QJsonValue::Type type = Null);
如果已經(jīng)得到了QJsonValue如何判斷內(nèi)部封裝的是什么類(lèi)型的數(shù)據(jù)?
bool isString() const;
bool isDouble() const;
bool isBool() const;
bool isObject() const;
bool isArray() const;
bool isUndefined() const;
bool isNull() const;
通過(guò)以上判斷函數(shù)以后,如果有需求可以將其轉(zhuǎn)換為對(duì)應(yīng)的基礎(chǔ)數(shù)據(jù)類(lèi)型,對(duì)應(yīng)的API函數(shù)如下:
轉(zhuǎn)換為字符串
Qstring toString() const;
Qstring toString(const QString &defaultValue) const;
轉(zhuǎn)換為浮點(diǎn)
double toDouble(double defaultValue = 0) const;
轉(zhuǎn)換為整型
int toInt(int defaultValue = 0) const
轉(zhuǎn)換為布爾
bool toBoll(bool defaultValue = false) const;
轉(zhuǎn)換為Json對(duì)象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
轉(zhuǎn)換為Json數(shù)組?
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
(4)QJsonDocument
它封裝了一個(gè)完整的JSON文檔
它可以從UTF-8編碼的基于文本表示,以及Qt本身的二進(jìn)制格式讀取和寫(xiě)入文檔
QJsonObject和QJsonArray這兩個(gè)是無(wú)法直接轉(zhuǎn)換為字符串類(lèi)型的,需要通過(guò)QJsonDocument類(lèi)來(lái)完成二者的轉(zhuǎn)換
QJsonObject和QJsonArray? ?=>? 字符串
1、創(chuàng)建QJsonDocument對(duì)象
QJsonDocument::QJsonDocument(const QJsonObject &object);
QJsonDocument::QJsonDocument(const QJsonArray &array);
2、將QJsonDocument對(duì)象數(shù)據(jù)序列化
QByteArray QJsonDocment::toBinaryData() const;? ? ? ?//二進(jìn)制格式的Json字符串
QByteArray QJsonDocment::toJson(JsonFormat format = Indented) const; //文本格式
3、使用得到的字符串進(jìn)行數(shù)據(jù)傳輸或者保存到文件
字符串 =>? QJsonObject和QJsonArray
1、將Json字符串 => QJsonDocument對(duì)象
[static]QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, Datavalidation validation = Validate): [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);
2、將文檔對(duì)象轉(zhuǎn)換為json數(shù)組/對(duì)象
2.1判斷文檔中存儲(chǔ)的數(shù)據(jù)是JSON數(shù)組還是對(duì)象
bool QJsonDocument::isArray() const;
bool QJsonDocument::isObject() const;
2.2轉(zhuǎn)換為JSON數(shù)組或?qū)ο?/p>
QJsonObject?QJsonDocument::array() const;
QJsonArray QJsonDocument::object() const;
3、調(diào)用QJsonArray/QJsonObject類(lèi)提供的API獲取存儲(chǔ)在里面的數(shù)據(jù)
4、JSON實(shí)戰(zhàn)?
4.1 構(gòu)建JSON字符串
實(shí)現(xiàn)效果
{ ?? ?"name": "China", ?? ?"info": { ?? ??? ?"capital": "beijing ", ?? ??? ?"asian": true, ?? ??? ?"founded": 1949 ?? ?}, ?? ?"provinces": [{ ?? ??? ??? ?"name": "shandong ", ?? ??? ??? ?"capital": "jinan" ?? ??? ?}, ?? ??? ?{ ?? ??? ??? ?"name": "guangdong ", ?? ??? ??? ?"capital": "guangzhou" ?? ??? ?} ?? ?] }
#include
#include
#include
#include
#include
#include
void writeJson() {
QJsonObject rootObj;
//1.插入name字段
rootObj.insert("name", "China");
//2 插入info字段
QJsonObject infoObj;
infoObj.insert("capital", "beijing");
infoObj.insert("asian", true);
infoObj.insert("founded", 1949);
rootObj.insert("info", infoObj);
//3 插入provinces字段
QJsonArray provinceArr;
QJsonObject SdObj;
QJsonObject GdObj;
SdObj.insert("name", "shandong");
SdObj.insert("capital", "jinan");
GdObj.insert("name", "guangdong");
GdObj.insert("capital", "guangzhou");
provinceArr.append(SdObj);
provinceArr.prepend(GdObj);
rootObj.insert("province", provinceArr);
//4 將rootObj轉(zhuǎn)化為json字符串
QJsonDocument doc(rootObj);
QByteArray json = doc.toJson();
//5 打印輸出
qDebug() << QString(json).toUtf8().data();
//6 將json字符串寫(xiě)入到文件
QFile file("d:\\QtTest\\china.json");
file.open(QFile::WriteOnly);
file.write(json);
file.close();
//文件可以使用NotePad++打開(kāi)
}
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
writeJson();
return a.exec();
}
小插曲,配置VS大法配置Qt環(huán)境
B站下載安裝第一步
CSDN使用配置第二步
4.2解析JSON字符串
#include
#include
#include
#include
#include
#include
void fromJson() {
//1.讀取文件
QFile file("d:\\QtTest\\china.json");
file.open(QFile::ReadOnly);
QByteArray json = file.readAll();
file.close();
QJsonDocument doc = QJsonDocument::fromJson(json);
if (!doc.isObject()) {
qDebug() << "Not an object!";
return;
}
QJsonObject obj = doc.object();
QStringList keys = obj.keys();
for (int i = 0; i < keys.size(); i++) {
//獲取key-value
QString key = keys[i];
QJsonValue value = obj.value(key);
if (value.isBool()) {
//打印輸出
qDebug() << key << ":" << value.toBool();
}
else if (value.isString()) {
//打印輸出
qDebug() << key << ":" << value.toString();
}
else if (value.isDouble()) {
//
qDebug() << key << ":" << value.toInt();
}
else if (value.isObject()) {
qDebug() << key << ":";
QJsonObject infoObj = value.toObject();
QString capital = infoObj["capital"].toString();
bool asian = infoObj["asian"].toBool();
int founded = infoObj["founded"].toInt();
qDebug() << " " << "capital" << ":" << capital;
qDebug() << " " << "asian" << ":" << asian;
qDebug() << " " << "founded" << ":" << founded;
}
else if (value.isArray()) {
QJsonArray provinceArray = value.toArray();
qDebug() << key << ":";
for (int i = 0; i < provinceArray.size(); i++) {
QJsonObject provinceObj = provinceArray[i].toObject();
QString name = provinceObj["name"].toString();
QString capital = provinceObj["capital"].toString();
qDebug() << " " << "name" << ":" << name << ", capital" << ":" << capital;
}
}
}
}
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
fromJson();
return a.exec();
}
5、筆記來(lái)源于B站明王
柚子快報(bào)邀請(qǐng)碼778899分享:Qt天氣預(yù)報(bào)系統(tǒng)之JSON
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。