0

0

c++如何解析JSON数据_c++ jsoncpp库使用教程【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-24 15:39:26

|

375人浏览过

|

来源于php中文网

原创

应使用 Json::CharReaderBuilder 构造解析器并检查 parseFromStream 返回值,错误时通过 errs 获取详细信息,避免直接访问未成功解析的空对象。

c++如何解析json数据_c++ jsoncpp库使用教程【实战】

怎么用 JsonCpp 读取字符串里的 JSON

JsonCpp 不自带解析器,得手动构造 Json::CharReaderBuilder 或用旧版 Json::Reader。新版推荐前者,更安全、支持 Unicode。

常见错误是直接传 raw string 给 parse() 却忽略返回值,导致解析失败却继续访问空对象:

Json::Value root;
Json::CharReaderBuilder builder;
std::string errs;
std::istringstream ss("{\"name\":\"alice\",\"age\":30}");
if (!Json::parseFromStream(builder, ss, &root, &errs)) {
    // 必须检查!errs 里有具体错误位置和原因
    std::cerr << "JSON parse error: " << errs << std::endl;
    return;
}
  • Json::CharReaderBuilder 默认启用 strictMode,不接受 trailing comma、单引号、注释等非标准写法
  • 如果输入来自网络或文件,注意编码:JsonCpp 只处理 UTF-8,别传 GBK 或 UTF-16
  • 不要用 Json::Reader(已弃用),它在 v1.9+ 中被标记为 deprecated,且线程不安全

如何安全访问嵌套字段并避免崩溃

直接链式调用 root["data"]["items"][0]["id"] 很危险——任一中间层缺失都会返回空 Json::Value,但 asInt()asString() 在空值上调用会抛 std::logic_error

正确做法是逐层检查 isNull()isMember(),或用带默认值的 get()

立即学习C++免费学习笔记(深入)”;

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载
// 安全写法:提供默认值,类型自动转换
int id = root.get("data", Json::Value::nullRef)
             .get("items", Json::Value::nullRef)
             .get(0, Json::Value::nullRef)
             .get("id", Json::Value(0)).asInt();
<p>// 或更清晰的判断
if (root.isObject() && 
root.isMember("user") && 
root["user"].isObject() && 
root["user"].isMember("email")) {
std::string email = root["user"]["email"].asString();
}
  • Json::Value::nullRef 是轻量占位符,比构造新 Json::Value() 更高效
  • get(key, defaultValue)defaultValue 类型必须和期望访问类型兼容,否则可能静默转成 0 或空串
  • 数组索引越界不会报错,array[100] 返回空值,务必先用 array.size() 判断

怎么把 C++ 对象序列化成 JSON 字符串

输出控制权在 Json::StreamWriterBuilder,不是简单调 toString() 就完事。默认格式是紧凑型(无换行缩进),调试时很难看。

Json::StreamWriterBuilder builder;
builder["indentation"] = "  ";  // 注意:必须是字符串,不能是 \t
builder["commentStyle"] = "None"; // 禁用注释(默认可能加 /* ... */)
std::string json_str = Json::writeString(builder, root);
  • 如果要兼容老系统或日志友好,设 builder["indentation"] = "" 回到紧凑模式
  • root.toStyledString() 是快捷方式,但无法定制,且内部固定用 4 空格缩进、启用注释,不适合生产环境
  • 浮点数精度默认 17 位,如需控制小数位数,得先转成字符串再塞进 Json::Value,JsonCpp 不提供 setPrecision()

链接和编译时最容易漏掉的细节

JsonCpp 编译后分静态库 jsoncpp 和头文件两部分,CMake 项目常只 link 库却忘了 include 目录,报 Json/json.h: No such file

CMakeLists.txt 正确写法示例:

find_package(jsoncpp REQUIRED)
target_link_libraries(myapp PRIVATE jsoncpp_lib)
target_include_directories(myapp PRIVATE ${jsoncpp_INCLUDE_DIRS})
  • Ubuntu/Debian 上装的是 libjsoncpp-dev,但头文件路径是 /usr/include/jsoncpp/json/json.h,所以 include 时得写 #include <json/json.h>,不是 <jsoncpp/json.h>
  • Windows 下若用 vcpkg,包名是 jsoncpp,但生成的库名可能是 jsoncpp.libjsoncpp_static.lib,取决于是否开启 JSONCPP_LIB_BUILD_SHARED
  • Release 模式下,JsonCpp 会关掉部分运行时检查(如类型断言),所以开发期出现的 LogicError 在 Release 可能变成静默错误或崩溃

最常被跳过的一步:没验证输入 JSON 是否合法就直接 parse,结果程序在用户上传的畸形数据上当场退出。解析前加个 std::string::find_first_not_of(" \t\r\n") != std::string::npos 至少能防空输入。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 10.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号