C++使用jsoncpp开发时能否将Json::Value设为类私有成员复用?
可行性结论
完全可行,该方案相比每次在成员函数内新建Json::Value实例效率更高,尤其适合频繁读写同一份JSON文件的场景,还可以在内存中保留JSON的修改状态,避免每次操作都重新解析文件。只要做好状态管理,不会出现数据混乱或者内存泄漏问题。
构造函数初始化方法
Json::Value自带默认构造函数,声明为私有成员后不需要额外特殊处理就会自动初始化为空值。如果你需要构造类实例时就预加载JSON文件内容,可以直接在构造函数中对其赋值,示例代码如下:
#include <json/json.h> #include <fstream> #include <string> #include <memory> class JsonFileHandler { private: Json::Value m_jsonRoot; // 私有Json::Value成员,用于复用 std::string m_filePath; public: // 构造函数初始化 explicit JsonFileHandler(std::string filePath) : m_filePath(std::move(filePath)) { // 可选:构造时直接加载目标JSON文件内容到m_jsonRoot std::ifstream ifs(m_filePath); if (ifs.is_open()) { Json::CharReaderBuilder builder; std::string parseErr; Json::parseFromStream(builder, ifs, &m_jsonRoot, &parseErr); } // 不需要预加载的话可以省略上面的逻辑,m_jsonRoot默认会初始化为空值 } };
成员函数访问示例
私有Json::Value成员可以在所有类的成员函数中直接访问使用,不需要额外调用接口,常用操作示例如下:
public: // 读取JSON中指定键的字符串值 std::string getStrValue(const std::string& key) const { if (m_jsonRoot.isMember(key) && m_jsonRoot[key].isString()) { return m_jsonRoot[key].asString(); } return ""; } // 修改JSON中指定键的字符串值 void setStrValue(const std::string& key, const std::string& value) { m_jsonRoot[key] = value; } // 重新加载当前路径的JSON文件内容,覆盖旧的m_jsonRoot bool reload() { std::ifstream ifs(m_filePath); if (!ifs.is_open()) return false; // 清空旧数据后加载新内容 m_jsonRoot.clear(); Json::CharReaderBuilder builder; std::string parseErr; return Json::parseFromStream(builder, ifs, &m_jsonRoot, &parseErr); } // 将当前m_jsonRoot的内容写入文件 bool save() const { std::ofstream ofs(m_filePath); if (!ofs.is_open()) return false; Json::StreamWriterBuilder builder; builder["indentation"] = " "; // 配置格式化缩进 std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter()); writer->write(m_jsonRoot, &ofs); return true; }
注意事项
- 每次加载新的JSON文件内容前,建议先调用
m_jsonRoot.clear()清空旧数据,避免前一次操作的残留内容混入新数据 Json::Value本身不是线程安全的,如果多线程同时操作同一个类实例,需要自行加锁保护读写操作- 如果需要重置
Json::Value为指定类型(比如空对象、空数组),可以直接赋值:m_jsonRoot = Json::Value(Json::objectValue)或者m_jsonRoot = Json::Value(Json::arrayValue)
内容的提问来源于stack exchange,提问作者razz
相关产品推荐
相关产品推荐

