本文摘自:https://blog.csdn.net/liang19890820/article/details/52767153
因爲最近在使用mqtt做數據的收發用到json,linux arm中因爲使用了cjson的第三方庫做了解析,比較簡單。
但是具體的在PC端使用的Qt進行的客戶端的編寫,而qt是自帶json的數據解析庫的,所以,需要簡單的研究下,摘過這篇博客,並做加入一點自己的筆記。
簡述
Qt5 中包含了處理 JSON 的類,均以 QJson 開頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模塊中,不需要額外引入其它模塊。
- 常用的JSON庫
json.org 中介紹了 JSON 在各種語言中的應用,在 C/C++ 中比較常用的JSON 庫主要有以下幾個:
JsonCpp
JsonCpp 是一個 C++ 用來處理 JSON 數據的開發包。
網址:http://jsoncpp.sourceforge.net/
cJSON
cJSON 是一個超輕巧,攜帶方便,單文件,簡單的可以作爲 ANSI-C 標準的 JSON 解析器。
網址:http://sourceforge.net/projects/cjson/
QJson
QJson 是一個基於 Qt 的開發包用來將 JSON 數據解析成 QVariant 對象,JSON 的數組將被映射爲QVariantList 實例,而其他對象映射爲 QVariantMap 實例。
網址:http://qjson.sourceforge.net/
關於 Qt 中對 JSON 的生成與解析,Qt5 以前的版本,可以使用 QJson 庫,需要單獨下載、編譯,才能使用。到了 Qt5,提供了專門的 QJsonDocument 及其相關類來讀和寫 JSON 文檔。
//組成json對象
QJsonObject json1;
json1.insert("name", "111");
json1.insert("pass", 222);
json1.insert("flout", 33.33);
QJsonDocument doc;
doc.setObject(json1);
QByteArray byte = doc.toJson(QJsonDocument::Compact);
qDebug()<<byte;
//解析json對象
QJsonParseError error;
doc = QJsonDocument::fromJson(byte, &error);
if(error.error == QJsonParseError::NoError)
{
if(doc.isObject())
{
QJsonObject obj = doc.object();
if(obj.contains("name")){//字符串的解析
QJsonValue value = obj.value("name");
if(value.isString()){
QString strname = value.toString();
qDebug()<< strname;
}
}
if(obj.contains("pass")){
QJsonValue value = obj.value("pass");
if(value.isDouble()){//整型的解析
int n_pass = value.toVariant().toInt();
qDebug()<<n_pass;
}
}
if(obj.contains("flout")){
QJsonValue value = obj.value("flout");
if(value.isDouble()){//double的解析
double n_pass = value.toDouble();
qDebug()<<n_pass;
}
}
}
}
QJsonArray versionArray;
versionArray.append(4.8);
versionArray.append(5.2);
versionArray.append(5.7);
// 構建 Json 對象 - Page
QJsonObject pageObject;
pageObject.insert("Home", "https://www.qt.io/");
pageObject.insert("Download", "https://www.qt.io/download/");
pageObject.insert("Developers", "https://www.qt.io/developers/");
// 構建 Json 對象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("Company", "Digia");
json.insert("From", 1991);
json.insert("Version", QJsonValue(versionArray));
json.insert("Page", QJsonValue(pageObject));
// 構建 Json 文檔
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
qDebug() << strJson;
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError); // 轉化爲 JSON 文檔
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) { // 解析未發生錯誤
if (doucment.isObject()) { // JSON 文檔爲對象
QJsonObject object = doucment.object(); // 轉化爲對象
if (object.contains("Name")) {
QJsonValue value = object.value("Name");
if (value.isString()) {
QString strName = value.toString();
qDebug() << "Name : " << strName;
}
}
if (object.contains("Company")) {
QJsonValue value = object.value("Company");
if (value.isString()) {
QString strCompany = value.toString();
qDebug() << "Company : " << strCompany;
}
}
if (object.contains("From")) {
QJsonValue value = object.value("From");
if (value.isDouble()) {
int nFrom = value.toVariant().toInt();
qDebug() << "From : " << nFrom;
}
}
if (object.contains("Version")) {
QJsonValue value = object.value("Version");
if (value.isArray()) { // Version 的 value 是數組
QJsonArray array = value.toArray();
int nSize = array.size();
for (int i = 0; i < nSize; ++i) {
QJsonValue value = array.at(i);
if (value.isDouble()) {
double dVersion = value.toDouble();
qDebug() << "Version : " << dVersion;
}
}
}
}
if (object.contains("Page")) {
QJsonValue value = object.value("Page");
if (value.isObject()) { // Page 的 value 是對象
QJsonObject obj = value.toObject();
if (obj.contains("Home")) {
QJsonValue value = obj.value("Home");
if (value.isString()) {
QString strHome = value.toString();
qDebug() << "Home : " << strHome;
}
}
if (obj.contains("Download")) {
QJsonValue value = obj.value("Download");
if (value.isString()) {
QString strDownload = value.toString();
qDebug() << "Download : " << strDownload;
}
}
if (obj.contains("Developers")) {
QJsonValue value = obj.value("Developers");
if (value.isString()) {
QString strDevelopers = value.toString();
qDebug() << "Developers : " << strDevelopers;
}
}
}
}
}
}
QString與QJOSN的相互轉化
例子一:
QJsonObject MainWindow::QstringToJson(QString jsonString)
{
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toLocal8Bit().data());
if(jsonDocument.isNull())
{
qDebug()<< "String NULL"<< jsonString.toLocal8Bit().data();
}
QJsonObject jsonObject = jsonDocument.object();
return jsonObject;
}
QString MainWindow::JsonToQstring(QJsonObject jsonObject)
{
return QString(QJsonDocument(jsonObject).toJson());
}
例子二:
//QString轉QJsonObject
QJsonObject convertQStringToQJsonObject(const QString jsonString)
{
QTextCodec *tc = QTextCodec::codecForName("UTF-8");//防止中文亂碼
QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data());
if (jsonDocument.isNull()){
g_pInterface->iDataPrintf("數據解析有誤"); //判斷是否解析出問題
}
QJsonObject jsonObject = jsonDocument.object();
return jsonObject;
}
//QJson轉QString
QString convertQJsonObjectToQString(const QJsonObject& jsonObject)
{
return QString(QJsonDocument(jsonObject).toJson());
}