Qt?http編程之nlohmann?json庫(kù)使用詳解
一、nlohman json庫(kù)
1、C++常用Json庫(kù)
- Jsoncpp
- boost ison
- Qt Json (不推薦使用)
- nlohman::json (推薦使用)下
Qt有json解析相關(guān)的類,但是并不推薦使用,原因很簡(jiǎn)單,Qt中json解析的相關(guān)類只在qt中有用,為了避免以后不用qt就不會(huì)解析json了,建議是使用nlohmann/json,這個(gè)json適用于任何C++框架
2、什么是 nlohman::json
2.1下載地址
git repo: https://github.com/nlohmann/json
2.2基本介紹
nlohmann是一個(gè)C++的JSON庫(kù),它提供了方便的方式來解析、生成和操作JSON數(shù)據(jù)。該庫(kù)由nlohmann編寫,是一個(gè)開源項(xiàng)目,被廣泛應(yīng)用于C++開發(fā)中。
nlohmann庫(kù)提供了簡(jiǎn)單易用的API,可以輕松地將JSON數(shù)據(jù)解析為C++對(duì)象,或者將C++對(duì)象序列化為JSON數(shù)據(jù)。它支持各種數(shù)據(jù)類型,包括字符串、數(shù)字、布爾值、數(shù)組和對(duì)象等。我們可以使用簡(jiǎn)潔的語法來訪問和操作JSON數(shù)據(jù),使得編寫JSON處理代碼變得更加簡(jiǎn)單和高效。
除了基本的JSON解析和生成功能,nlohmann庫(kù)還提供了一些高級(jí)功能,如JSON合并、JSON差異比較、JSON數(shù)據(jù)查詢等。這些功能可以幫助我們更方便地處理復(fù)雜的JSON數(shù)據(jù),提高代碼的可維護(hù)性和可讀性。
二、具體解析示例
1、引入頭文件
nlohman:json只需要一個(gè)頭文件json.hpp,不需要編譯成lib,直接放到項(xiàng)目中即可使用
#include <iostream> #include "json.hpp" #include <string> //取別名方便下面使用 using json_t = nlohmann::json; using namespace std;
2、具體思路
2.1自定義json數(shù)據(jù)
//如果是沒有多層嵌套的看一下怎么拿到
json_t jRawdata; //定義一個(gè)json對(duì)象
jRawdata["username"] = "jackli";
jRawdata["pwd"] = "123456";
2.2dump方法序列化
這個(gè)適用于json格式只有一層的
// 序列化,把json數(shù)據(jù)轉(zhuǎn)成string
string _rawdata = jRawdata.dump();
cout << _rawdata << endl;
2.3parse方法反序列化
// 反序列化,把string數(shù)據(jù)轉(zhuǎn)成json
string json_str = R"(
{
"date": "20220701",
"level": 1,
"msg": "register account",
"status": "success",
"username": "jackli"
}
)";
try
{
//關(guān)鍵的parse方法
json_t j2 = json_t::parse(json_str);
string date = j2["date"];
cout << date << endl;
}
2.4異常的catch參數(shù)
catch (std::exception& e){}
3、整體代碼
int main()
{
//如果是沒有多層嵌套的看一下怎么拿到
json_t jRawdata; //定義一個(gè)json對(duì)象
jRawdata["username"] = "jackli";
jRawdata["pwd"] = "123456";
// 序列化,把json數(shù)據(jù)轉(zhuǎn)成string
string _rawdata = jRawdata.dump();
cout << _rawdata << endl;
// 反序列化,把string數(shù)據(jù)轉(zhuǎn)成json
string json_str = R"(
{
"date": "20220701",
"level": 1,
"msg": "register account",
"status": "success",
"username": "jackli"
}
)";
try
{
//關(guān)鍵的parse方法
json_t j2 = json_t::parse(json_str);
string date = j2["date"];
cout << date << endl;
}
catch (std::exception& e)
{
cout << "json parse failed" << endl;
return -1;
}
cout << "解析json數(shù)組" << endl;
if (parse_array() != 0)
{
cout << "parse array failed" << endl;
}
return 0;
}
三、多層嵌套json數(shù)據(jù)獲取
1、整體代碼
int parse_array()
{
string jsonstr = R"(
{
"id":"2022",
"name":{"EnglishName":"JackMa"},
"title":[
{
"company":"taobao",
"position" : "AAA",
"salary" : "10000"
},
{
"company":"zhifubao",
"position" : "CCC",
"salary" : "890898"
},
{
"company":"pingtouge",
"position" : "KKK",
"salary" : "76843"
}
]
}
)";
//都放在try-catch語句里
try
{
//先用一個(gè)parse方法得到j(luò)son格式數(shù)據(jù)
json_t jsonObj = json_t::parse(jsonstr);
//嵌套的就層層獲取
//"name":{"EnglishName":"JackMa"},
json_t nameJson = jsonObj["name"];
string engName = nameJson["EnglishName"];
cout << "engName = " << engName << endl;
//多層嵌套就用for循環(huán)
json_t titleJson = jsonObj["title"];
int size = titleJson.size();
cout << "size = " << size << endl;
//for (int i = 0; i < size; i++)
//{
// /*
// {
// "company":"taobao",
// "position" : "AAA",
// "salary" : "10000"
// },
// */
// cout << titleJson[i]["company"] << endl;
// cout << titleJson[i]["position"] << endl;
// cout << titleJson[i]["salary"] << endl;
//}
//智能索引
for (auto jsonItem : titleJson)
{
cout << jsonItem["company"] << endl;
cout << jsonItem["position"] << endl;
cout << jsonItem["salary"] << endl;
}
}
catch (const std::exception&)
{
return -1;
}
return 0;
}
2、for循環(huán)兩種形式
for (int i = 0; i < size; i++)
{
/*
{
"company":"taobao",
"position" : "AAA",
"salary" : "10000"
},
*/
cout << titleJson[i]["company"] << endl;
cout << titleJson[i]["position"] << endl;
cout << titleJson[i]["salary"] << endl;
}
//智能索引
//jsonItem 是一個(gè)自動(dòng)推導(dǎo)的變量,會(huì)依次表示 titleJson 中的每個(gè) JSON 對(duì)象。
for (auto jsonItem : titleJson)
{
cout << jsonItem["company"] << endl;
cout << jsonItem["position"] << endl;
cout << jsonItem["salary"] << endl;
}
以上就是Qt里nlohmann json庫(kù)使用的簡(jiǎn)單介紹。
到此這篇關(guān)于Qt http編程之nlohmann json庫(kù)使用詳解的文章就介紹到這了,更多相關(guān)Qt nlohmann json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++中vector的兩個(gè)小tips分享
這篇文章主要給大家介紹了關(guān)于C++中vector的兩個(gè)小tips,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
C語言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解
這篇文章主要為大家詳細(xì)介紹了C語言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
基于C語言實(shí)現(xiàn)五子棋游戲完整實(shí)例代碼
這篇文章主要介紹了基于C語言實(shí)現(xiàn)五子棋游戲完整實(shí)例代碼,相信對(duì)于學(xué)習(xí)游戲開發(fā)的朋友會(huì)有一定的幫助與借鑒價(jià)值,需要的朋友可以參考下2014-08-08
C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)
今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來為您詳細(xì)呈現(xiàn)2012-11-11
關(guān)于Qt?C++中connect的幾種寫法代碼示例
這篇文章介紹了Qt中connect函數(shù)的不同編寫方式,包括傳統(tǒng)的槽函數(shù)寫法、使用函數(shù)指針的寫法、Lambda表達(dá)式以及使用QOverload選擇重載信號(hào)的寫法,每種寫法都有其特點(diǎn)和適用場(chǎng)景,程序員應(yīng)根據(jù)具體需求選擇最合適的方式,需要的朋友可以參考下2024-11-11
C++設(shè)置系統(tǒng)時(shí)間及系統(tǒng)時(shí)間網(wǎng)絡(luò)更新的方法
這篇文章主要介紹了C++設(shè)置系統(tǒng)時(shí)間及系統(tǒng)時(shí)間網(wǎng)絡(luò)更新的方法,涉及網(wǎng)絡(luò)程序設(shè)計(jì)與系統(tǒng)函數(shù)的使用,需要的朋友可以參考下2014-10-10

