深入浅出 JSONCpp

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 种类型

  1. null
  2. bool(true / false)
  3. number(整数 / 浮点)
  4. string
  5. array
  6. object

示例大全:

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 入门工具


相关推荐
寻寻觅觅☆2 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++
马猴烧酒.2 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
lightqjx2 小时前
【C++】unordered系列的封装
开发语言·c++·stl·unordered系列
北京迅为2 小时前
《【北京迅为】itop-3568开发板NPU使用手册》- 第 7章 使用RKNN-Toolkit-lite2
linux·人工智能·嵌入式·npu
阿猿收手吧!3 小时前
【C++】string_view:高效字符串处理指南
开发语言·c++
Dragon~Snow3 小时前
Linux Centos9 安装 Elasticsearch
linux·elasticsearch·jenkins
熊延3 小时前
麒麟V10系统安装部署elasticsearch
linux·运维·服务器·elasticsearch·搜索引擎·全文检索
Jia ming3 小时前
跟踪器与事件使用举例
linux·事件·跟踪器
生活很暖很治愈3 小时前
Linux——基础IO&软硬链接
linux·ubuntu