JsonCpp 新手小白入门博客
适合人群:
- 完全没接触过 JsonCpp 的新手
- 刚学 C/C++,想处理 JSON 数据
- 学网络编程、配置文件解析、后端基础的同学
阅读目标:
- 看完你能装上 JsonCpp
- 看懂 JSON 是什么
- 会用 JsonCpp 读 / 写 JSON
- 理解 JsonCpp 的核心 API 设计思想
一、为什么要学 JsonCpp?
在正式讲 JsonCpp 之前,我们先解决一个灵魂问题:
👉 我为什么要学 JSON?又为什么是 JsonCpp?
1.1 现实世界里的 JSON
你可能没意识到,但你每天都在用 JSON:
- 浏览器访问网页,请求 / 响应的数据
- Web 后端接口(RESTful API)
- 配置文件(vs code、clangd、cmake)
- 微服务之间的数据交换
- 前后端通信
举个最简单的例子:
json
{
"name": "Tom",
"age": 18,
"skills": ["C++", "Linux", "Network"]
}
这种 结构化、可读性强、跨语言 的数据格式,就是 JSON。
1.2 C/C++ 的尴尬处境
如果你写过 C/C++,你会发现一个问题:
C/C++ 标准库里,没有 JSON 支持
这就导致:
- 你要自己解析字符串(痛苦)
- 自己维护数据结构(极其痛苦)
- 一不小心就越界 / 崩溃
于是:
👉 JsonCpp 出现了
二、JSON 是什么?
在学 JsonCpp 前,我们必须先真正理解 JSON。
2.1 JSON 的本质
JSON 的全称是:
JavaScript Object Notation
但注意:
❗ JSON 不是 JavaScript 专属
❗ 它只是"看起来像 JS 对象"
JSON 是一种:
- 轻量级
- 文本格式
- 用于数据交换
2.2 JSON 的 6 种数据类型
JSON 里只支持 6 种类型:
nullbool(true / false)number(整数 / 浮点)stringarrayobject
示例大全:
json
{
"null_value": null,
"bool_value": true,
"int_value": 10,
"double_value": 3.14,
"string_value": "hello",
"array_value": [1, 2, 3],
"object_value": {"a": 1, "b": 2}
}
2.3 JSON 的两条铁律(必记)
✅ key 一定是字符串
json
{ "name": "Tom" }
❌ 错误写法:
json
{ name: "Tom" }
✅ 最后一个元素不能有逗号
json
{
"a": 1,
"b": 2
}
三、JsonCpp 是什么?
3.1 JsonCpp 简介
JsonCpp 是一个:
- 用 C++ 编写 的
- 开源
- 跨平台
- 专门用于 JSON 解析与生成的库
核心能力:
- 把 JSON 字符串 → C++ 对象
- 把 C++ 对象 → JSON 字符串 / 文件
3.2 JsonCpp 的设计哲学
JsonCpp 的核心思想只有一句话:
用一个 Json::Value,表示一切 JSON 数据
无论你是:
- int
- string
- array
- object
最终都会变成:
cpp
Json::Value root;
这点一旦理解,后面就全通了。
四、JsonCpp 的安装与配置
4.1 Linux 下安装
方式一:apt 安装
bash
sudo apt install libjsoncpp-dev
安装完成后:
- 头文件:
/usr/include/jsoncpp/json/ - 库文件:
/usr/lib/libjsoncpp.so
方式二:源码安装
bash
git clone https://github.com/open-source-parsers/jsoncpp.git
cd jsoncpp
mkdir build && cd build
cmake ..
make
sudo make install
4.2 编译时如何链接
bash
g++ test.cpp -ljsoncpp
如果找不到头文件:
cpp
#include <json/json.h>
五、JsonCpp 的核心类:Json::Value
这一节是全文最核心的部分
5.1 Json::Value 是什么?
Json::Value 是一个:
- 万能容器
- 可以表示任何 JSON 类型
它内部保存了:
- 当前值的类型
- 实际数据
5.2 Json::Value 的常见类型
cpp
Json::Value v;
v = 10; // int
v = 3.14; // double
v = "hello"; // string
v = true; // bool
5.3 object 的使用方式
cpp
Json::Value root;
root["name"] = "Tom";
root["age"] = 18;
本质:
operator[]被重载了
5.4 array 的使用方式
cpp
Json::Value arr;
arr.append(1);
arr.append(2);
arr.append(3);
六、使用 JsonCpp 生成 JSON
6.1 一个完整示例
cpp
#include <json/json.h>
#include <iostream>
int main()
{
Json::Value root;
root["name"] = "Alice";
root["age"] = 20;
Json::Value skills;
skills.append("C++");
skills.append("Linux");
root["skills"] = skills;
Json::StreamWriterBuilder writer;
std::string json = Json::writeString(writer, root);
std::cout << json << std::endl;
return 0;
}
输出结果:
json
{
"age" : 20,
"name" : "Alice",
"skills" : [ "C++", "Linux" ]
}
七、使用 JsonCpp 解析 JSON
7.1 从字符串解析
cpp
std::string str = "{\"name\":\"Bob\",\"age\":18}";
Json::Value root;
Json::CharReaderBuilder reader;
std::string errs;
std::istringstream iss(str);
Json::parseFromStream(reader, iss, &root, &errs);
7.2 访问解析后的数据
cpp
std::string name = root["name"].asString();
int age = root["age"].asInt();
八、JsonCpp 常见 API 汇总
8.1 类型判断
cpp
value.isNull();
value.isInt();
value.isString();
value.isArray();
value.isObject();
8.2 类型转换
cpp
value.asInt();
value.asString();
value.asBool();
value.asDouble();
九、新手常见坑
9.1 访问不存在的 key
cpp
root["not_exist"].asInt(); // 不会崩,但值是 0
⚠️ 一定要先判断:
cpp
root.isMember("not_exist");
9.2 忘记链接库
bash
undefined reference to `Json::Value::Value()`
👉 原因:没加 -ljsoncpp
十、JsonCpp 的应用场景
- 配置文件解析
- 网络通信协议
- RPC / HTTP 接口
- 日志结构化
- 项目参数管理
一句话总结:
JsonCpp = C++ 世界里最友好的 JSON 入门工具
完