
一、jsoncpp是什么jsoncpp 是一个用 C 语言编写的开源库专门用来处理 JSON 数据。你可以把它想象成一个“翻译官”或“转换器”。它的核心工作就是两件事解析读把一串 JSON 格式的文本比如从网络或文件里读到的字符串转换成 C 程序里能方便操作的数据。序列化写把 C 程序里的数据转换成一串符合 JSON 格式标准的文本方便存储或发送给别人。简单来说有了 jsoncpp你的 C 程序就能轻松读懂和生成 JSON 了。二、jsoncpp 的核心类与函数全景jsoncpp 提供了丰富的类和函数来处理 JSON 数据。下面按功能分类介绍所有重要的类和函数。1. Json::Value万能值容器这是 jsoncpp 里最核心、最常用的类。它就像一个大盒子可以装下 JSON 支持的所有类型的数据null空值。booltrue 或 false。int / double整数或小数。string字符串。array数组在 C 里用 vector 表示。object对象在 C 里用 map 表示键是字符串。Json::Value 的常用成员函数asString()、asInt()、asDouble()、asBool()将 Value 转换为对应类型。isString()、isInt()、isDouble()、isBool()、isNull()、isArray()、isObject()判断当前 Value 的类型。size()返回数组长度或对象成员个数。empty()判断数组或对象是否为空。clear()清空 Value 的内容。removeMember(const char* key)删除对象中的指定成员。getMemberNames()获取对象所有键名的列表std::vectorstd::string。operator[]通过索引数组或键名对象访问子元素。append(const Value value)向数组末尾追加元素。toStyledString()将 Value 格式化为带缩进的 JSON 字符串调试用。2. 解析器类Reader / CharReaderJson::Reader旧版解析器这是旧版本里用来“读”JSON 字符串的类。你把一个 JSON 字符串和一个空的 Json::Value 交给它它就会尝试把字符串解析成结构化的数据填到那个 Value 里。常用函数parse(const std::string document, Value root, bool collectComments true)从字符串解析。parse(std::istream is, Value root, bool collectComments true)从输入流解析。getFormattedErrorMessages()获取解析错误的格式化信息。Json::CharReader Json::CharReaderBuilder新版推荐新版本推荐使用Json::CharReader和Json::CharReaderBuilder原理类似但更灵活。常用函数Json::CharReaderBuilder::newCharReader()创建 CharReader 实例。CharReader::parse(const char* beginDoc, const char* endDoc, Value* root, std::string* errs)解析字符范围。Json::parseFromStream(CharReaderBuilder builder, std::istream stream, Value* root, std::string* errs)从流解析的便捷函数。3. 写入器类Writer / StreamWriterJson::FastWriter旧版快速写入器追求速度生成的字符串没有换行和缩进压缩格式节省空间。write(const Value root)将 Value 序列化为压缩 JSON 字符串。Json::StyledWriter旧版美化写入器追求可读性生成的字符串有漂亮的换行和缩进方便人眼阅读和调试。write(const Value root)将 Value 序列化为美化 JSON 字符串。Json::StreamWriterBuilder Json::StreamWriter新版推荐新版本推荐使用Json::StreamWriterBuilder和Json::StreamWriter功能更强大。StreamWriterBuilder::newStreamWriter()创建 StreamWriter 实例。StreamWriter::write(const Value root, std::ostream* os)将 Value 写入输出流。Json::writeString(StreamWriterBuilder builder, const Value root)直接返回字符串的便捷函数。builder[indentation] 通过设置 builder 属性控制缩进格式。4. 其他重要类和函数Json::Features用于配置解析器的行为例如是否允许注释、是否严格校验等。Features::all()启用所有特性包括注释。Features::strictMode()严格模式只允许标准 JSON。Json::Exception / Json::RuntimeErrorjsoncpp 在解析或操作出错时会抛出异常。可以通过 try-catch 捕获Json::Exception来处理错误。Json::ValueIterator / Json::ValueConstIterator用于遍历数组或对象的迭代器。begin()、end()获取迭代器起始和结束位置。key()获取当前迭代器指向的键名仅对象。operator*解引用获取当前 Value。Json::Value::MembersgetMemberNames()返回的类型即std::vectorstd::string用于获取对象的所有键名。5. 全局工具函数Json::valueToQuotedString(const char* value)将字符串转为带引号的 JSON 字符串含转义。Json::valueToString(Int value)、Json::valueToString(UInt value)、Json::valueToString(double value)将数值转为 JSON 字符串。Json::isValid(const std::string jsonStr)检查 JSON 字符串是否合法部分版本支持。掌握了这些类和函数你就能灵活运用 jsoncpp 处理各种 JSON 数据场景了。三、一个超简单的例子一看就懂假设我们有一段 JSON 字符串表示一个用户的简单信息{ name: 张三, age: 25, isStudent: false }用 jsoncpp 来读它在程序里修改年龄再写回去的代码骨架如下#include iostream #include string #include json/json.h // 引入 jsoncpp 头文件 int main() { // 1. 准备要解析的 JSON 字符串 std::string jsonStr R({name:张三,age:25,isStudent:false}); // 2. 创建一个用来装结果的“空盒子” Json::Value root; Json::CharReaderBuilder readerBuilder; std::string errs; // 3. 解析读 std::istringstream s(jsonStr); bool parsingSuccessful Json::parseFromStream(readerBuilder, s, root, errs); if (!parsingSuccessful) { std::cout 解析失败: errs std::endl; return 1; } // 4. 现在可以像操作普通数据一样操作它了 std::string name root[name].asString(); // 取出名字 int age root[age].asInt(); // 取出年龄 root[age] 26; // 修改年龄为26 root[city] 北京; // 添加一个新字段“城市” // 5. 再转换写回字符串 Json::StreamWriterBuilder writerBuilder; writerBuilder[indentation] ; // 设置缩进让输出好看 std::string outputStr Json::writeString(writerBuilder, root); // 6. 输出结果 std::cout 处理后的JSON:n outputStr std::endl; return 0; }运行后输出会是{ name : 张三, age : 26, isStudent : false, city : 北京 }四、jsoncpp 的主要特点与使用场景纯 C 实现不依赖其他第三方库集成简单。易于使用接口直观像操作数组和字典一样操作 JSON。足够高效对于大多数应用场景其解析和序列化速度都是可以接受的。跨平台Windows、Linux、macOS 上都能用。典型使用场景配置文件用 JSON 文件保存程序的设置启动时用 jsoncpp 读入。网络通信和 Web 服务 API 交互时收发的数据常常是 JSON 格式。数据持久化将程序中的结构体或对象序列化成 JSON 字符串保存到数据库或文件。日志记录将日志信息以结构化的 JSON 格式输出便于后续分析。五、总结jsoncpp 就是一个让 C 程序能轻松“读懂”和“生成” JSON 数据的工具包。你只需要记住一切数据操作都围绕Json::Value这个万能容器。用Reader或新版的 CharReader把字符串“变”成 Value。用Writer或新版的 StreamWriter把 Value“变”回字符串。掌握了这三个概念你就掌握了 jsoncpp 最核心的用法。剩下的就是查阅官方文档了解更详细的 API 和选项了。