一、nlohman json库
1、C++常用Json库
- Jsoncpp
- boost ison
- Qt Json (不推荐使用)
- nlohman::json (推荐使用)下
Qt有json解析相关的类,但是并不推荐使用,原因很简单,Qt中json解析的相关类只在qt中有用,为了避免以后不用qt就不会解析json了,建议是使用nlohmann/json,这个json适用于任何C++框架
2、什么是 nlohman::json
2.1下载地址
git repo: https://github.com/nlohmann/json
2.2基本介绍
nlohmann是一个C++的JSON库,它提供了方便的方式来解析、生成和操作JSON数据。该库由nlohmann编写,是一个开源项目,被广泛应用于C++开发中。
nlohmann库提供了简单易用的API,可以轻松地将JSON数据解析为C++对象,或者将C++对象序列化为JSON数据。它支持各种数据类型,包括字符串、数字、布尔值、数组和对象等。我们可以使用简洁的语法来访问和操作JSON数据,使得编写JSON处理代码变得更加简单和高效。
除了基本的JSON解析和生成功能,nlohmann库还提供了一些高级功能,如JSON合并、JSON差异比较、JSON数据查询等。这些功能可以帮助我们更方便地处理复杂的JSON数据,提高代码的可维护性和可读性。
二、具体解析示例
1、引入头文件
nlohman:json只需要一个头文件json.hpp,不需要编译成lib,直接放到项目中即可使用
#include <iostream> #include "json.hpp" #include <string> //取别名方便下面使用 using json_t = nlohmann::json; using namespace std;
2、具体思路
2.1自定义json数据
//如果是没有多层嵌套的看一下怎么拿到 json_t jRawdata; //定义一个json对象 jRawdata["username"] = "jackli"; jRawdata["pwd"] = "123456";
2.2dump方法序列化
这个适用于json格式只有一层的
// 序列化,把json数据转成string string _rawdata = jRawdata.dump(); cout << _rawdata << endl;
2.3parse方法反序列化
// 反序列化,把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; }
2.4异常的catch参数
catch (std::exception& e){}
3、整体代码
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; }
三、多层嵌套json数据获取
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 { //先用一个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; }
2、for循环两种形式
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库使用的简单介绍。