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


相关推荐
换个号退隐江湖i1 小时前
LLM 调试日志刷屏怎么办?用 tee 边看边存
linux
@insist1231 小时前
系统集成项目管理工程师-信息和文档管理
网络·数据库·软考·系统集成项目管理工程师·软考中项·软件水平考试
极客互动API1 小时前
企业微信 iPad 协议服务搭建与 AI 回调实战
网络·汇编·人工智能·微信·企业微信·ipad
DYWorker0011 小时前
搭建嵌入式Linux虚拟机开发环境
linux
QH139292318801 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
weipt1 小时前
从ollama到llama.cpp
linux·服务器·llama
LabVIEW开发1 小时前
基于原始套接字实现LabVIEW网络Ping检测的编程方法
网络·labview·labview知识·labview功能·labview程序
加油码2 小时前
动静态库的链接底层原理(进阶版)
linux·c++
一木 之林2 小时前
三、内存管理、指针与堆栈
c语言·jvm·c++
东莞和裕包装2 小时前
如何管控广州定制纸箱生产中的啤切精度与印刷色差质量问题
大数据·运维·网络·人工智能