#pragma once #include #include #include #include using njson = nlohmann::json; /// ============================================================================================= /// 使用说明: /// 创建 ------------- // json j; // j["name"] = "Alice"; // j["age"] = 25; // j["address"] = {{"city", "Beijing"}, {"country", "China"}}; /// 字符串解析 ------------- // json::parse(R"({"name": "Alice", "age": 25})"); // 说明:解析失败会抛出异常 // try { // auto j = json::parse("invalid json"); // } // catch (json::parse_error& e) { // std::cerr << "JSON 解析错误: " << e.what() << std::endl; // } /// 文件解析 ------------- // std::ifstream file("data.json"); // json j; // file >> j; /// 访问 JSON 数据 ------------- // std::string name = j["name"]; // 直接访问 // int age = j.at("age"); // 使用 at() 检查 key 是否存在 // auto address = j["address"]; // 获取数组 /// 序列化为字符串 ------------- // std::string json_str = j.dump(4); // 4 表示缩进,美化输出 /// 数组解析 ------------- // json jArray = json::array() // jArray.push_back(1); // jArray.push_back(2); // json j; // j["data"] = {1,2,3,4,5}; // std::vector v1; // v1 = j.at["data"].get>() class JSON { public: static bool load(std::string jsonfile, njson& json) { std::ifstream ifs(jsonfile); if (!ifs.is_open()) { return false; } try { ifs >> json; } catch (nlohmann::json::parse_error& e) { return false; } return true; } static bool parse(std::string jsonstr, njson& json) { try { if (!jsonstr.empty()) { json = njson::parse(jsonstr); } } catch (nlohmann::json::parse_error& e) { std::cout << "JSON parse error: " << e.what() << "\n" << jsonstr << std::endl; return false; } return true; } template static void read(njson& json, std::string k, T& v) { try { if (json.contains(k)) { v = json.at(k).get(); } } catch (const nlohmann::detail::exception& e) { std::cout << "JSON read error: k=" << k << ", err=" << e.what() << std::endl; } } static void parse(std::string jsonstr, std::vector& vd) { njson jsonroot; if (JSON::parse(jsonstr, jsonroot)) { vd = jsonroot.get>(); } } };