往期回顾
【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客
Jsoncpp
boost ison
Qt Json (不推荐使用)
nlohman::json (推荐使用)下
Qt有json解析相关的类,但是并不推荐使用,原因很简单,Qt中json解析的相关类只在qt中有用,为了避免以后不用qt就不会解析json了,建议是使用nlohmann/json,这个json适用于任何C++框架
git repo: https://github.com/nlohmann/json
nlohmann是一个C++的JSON库,它提供了方便的方式来解析、生成和操作JSON数据。该库由nlohmann编写,是一个开源项目,被广泛应用于C++开发中。
nlohmann库提供了简单易用的API,可以轻松地将JSON数据解析为C++对象,或者将C++对象序列化为JSON数据。它支持各种数据类型,包括字符串、数字、布尔值、数组和对象等。我们可以使用简洁的语法来访问和操作JSON数据,使得编写JSON处理代码变得更加简单和高效。
除了基本的JSON解析和生成功能,nlohmann库还提供了一些高级功能,如JSON合并、JSON差异比较、JSON数据查询等。这些功能可以帮助我们更方便地处理复杂的JSON数据,提高代码的可维护性和可读性。
nlohman:json只需要一个头文件json.hpp,不需要编译成lib,直接放到项目中即可使用
- #include
- #include "json.hpp"
- #include
-
-
- //取别名方便下面使用
- using json_t = nlohmann::json;
-
- using namespace std;
- //如果是没有多层嵌套的看一下怎么拿到
- json_t jRawdata; //定义一个json对象
- jRawdata["username"] = "jackli";
- jRawdata["pwd"] = "123456";
这个适用于json格式只有一层的
- // 序列化,把json数据转成string
- string _rawdata = jRawdata.dump();
- cout << _rawdata << endl;
- // 反序列化,把string数据转成json
- string json_str = R"(
- {
- "date": "20220701",
- "level": 1,
- "msg": "register account",
- "status": "success",
- "username": "jackli"
- }
- )";
-
- try
- {
- //关键的parse方法
- json_t j2 = json_t::parse(json_str);
- string date = j2["date"];
- cout << date << endl;
- }
catch (std::exception& e){}
- int main()
- {
- //如果是没有多层嵌套的看一下怎么拿到
- json_t jRawdata; //定义一个json对象
- jRawdata["username"] = "jackli";
- jRawdata["pwd"] = "123456";
-
- // 序列化,把json数据转成string
- string _rawdata = jRawdata.dump();
- cout << _rawdata << endl;
-
- // 反序列化,把string数据转成json
- string json_str = R"(
- {
- "date": "20220701",
- "level": 1,
- "msg": "register account",
- "status": "success",
- "username": "jackli"
- }
- )";
-
- try
- {
- //关键的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数组" << endl;
- if (parse_array() != 0)
- {
- cout << "parse array failed" << endl;
- }
-
- return 0;
- }
- 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
- {
- //先用一个parse方法得到json格式数据
- json_t jsonObj = json_t::parse(jsonstr);
-
- //嵌套的就层层获取
- //"name":{"EnglishName":"JackMa"},
- json_t nameJson = jsonObj["name"];
- string engName = nameJson["EnglishName"];
- cout << "engName = " << engName << endl;
-
- //多层嵌套就用for循环
- 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;
- }
- 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 是一个自动推导的变量,会依次表示 titleJson 中的每个 JSON 对象。
- for (auto jsonItem : titleJson)
- {
- cout << jsonItem["company"] << endl;
- cout << jsonItem["position"] << endl;
- cout << jsonItem["salary"] << endl;
- }
以上就是Qt里nlohmann json库使用的简单介绍。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!