当前位置: 首页 > news >正文

JsonCpp源码分析——Writer

1、Writer 类是 jsoncpp 中用于将 JSON 数据转换为字符串的关键组件。这个类的设计使得从 Json::Value 对象生成 JSON 字符串变得简单而高效。Writer 类的主要任务是将内存中的 JSON 数据结构转化为符合 JSON 标准的字符串格式,以便可以进行存储、传输或与其他系统交互,其实就是一个序列化的工具。
2、Writer 类的核心功能是将 JSON 数据结构(如对象、数组、字符串和数字)序列化为 JSON 格式的字符串。它支持将 Json::Value 对象转换为 JSON 字符串,这些对象可以包含复杂的嵌套数据结构。

#include <iostream>
#include <json/json.h>int main() {// 创建一个 JSON 对象Json::Value root;root["name"] = "Alice";root["age"] = 28;root["is_student"] = false;// 创建一个 JSON 数组Json::Value hobbies(Json::arrayValue);hobbies.append("Cycling");hobbies.append("Photography");root["hobbies"] = hobbies;// 使用 Writer 类将 JSON 对象转换为字符串Json::StreamWriterBuilder writerBuilder;std::string jsonString = Json::writeString(writerBuilder, root);// 输出生成的 JSON 字符串std::cout << jsonString << std::endl;return 0;
}

在上面的示例中,我们创建了一个包含基本数据类型和数组的 JSON 对象,并使用 Json::StreamWriterBuilder 将其转换为 JSON 字符串。
3、StyledWriter是Writer的子类,其主要功能是将 JSON 数据结构转化为美观的 JSON 字符串。它在 JSON 字符串中添加缩进和换行,以提高可读性,可以理解为输出的字符串中包含\n和空行。
4、StreamWriterBuilder 提供了多种配置选项,可以控制 JSON 输出的格式。通过设置缩进、空白字符等选项,可以生成易于阅读和调试的 JSON 字符串,默认的配置如下,可以自行配置。

void StreamWriterBuilder::setDefaults(Json::Value* settings) {//"All" 表示保留所有类型的注释。注释风格的选项可能包括 "None"(不允许注释)、"All"(允许所有类型的注释)、"Cpp"(仅允许 C++ 风格的注释)(*settings)["commentStyle"] = "All";// \t 表示使用制表符作为缩进字符。可以用空格替代制表符,例如 " "(四个空格)(*settings)["indentation"] = "\t";// 如果为 true,生成的 JSON 字符串将遵循 YAML 兼容的格式,允许 YAML 特性,如支持特殊字符的转义(*settings)["enableYAMLCompatibility"] = false;// 指定是否省略值为 null 的字段。如果为 true,则不会在输出的 JSON 字符串中包含值为 null 的字段(*settings)["dropNullPlaceholders"] = false;(*settings)["useSpecialFloats"] = false;// 默认不支持utf8, true为支持utf8(*settings)["emitUTF8"] = false;(*settings)["precision"] = 17;(*settings)["precisionType"] = "significant";
}

使用StreamWriterBuilder进行格式化:

#include <json/json.h>
#include <iostream>int main() {// 创建一个 JSON 对象Json::Value root;root["name"] = "Alice";root["age"] = 28;root["is_student"] = false;// 创建一个 JSON 数组Json::Value hobbies(Json::arrayValue);hobbies.append("Cycling");hobbies.append("Photography");root["hobbies"] = hobbies;// 创建 StreamWriterBuilder 对象Json::StreamWriterBuilder writerBuilder;// 配置输出选项writerBuilder["indentation"] = "    "; // 设置四个空格的缩进// 将 JSON 对象转换为字符串std::string jsonString = Json::writeString(writerBuilder, root);// 输出生成的 JSON 字符串std::cout << jsonString << std::endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 苹果首款AI手机发布!iPhone 16全新AI功能体验感拉满
  • 【MATLAB】模拟退火算法
  • 软硬链接 动静态库(深入地址空间)
  • Qt:解决player->duration()第一次获取媒体时长为0的问题
  • 在 CentOS 中永久关闭防火墙的步骤
  • mybatis 查询Not Found TableInfoCache
  • Ajax实现一个简单的文件上传进度条
  • 如何将西瓜视频保存到本地(方法)
  • 企业会议室预约管理系统
  • 边缘检测运用
  • 基于单片机实现的的多点分布室内环境监测系统
  • ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE
  • 代码随想录 第九章 动态规划part03 01背包问题 二维
  • 力扣100题——栈和堆
  • 【GNSS】PPPH软件操作手册翻译
  • 230. Kth Smallest Element in a BST
  • Bootstrap JS插件Alert源码分析
  • Brief introduction of how to 'Call, Apply and Bind'
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • EOS是什么
  • Git 使用集
  • If…else
  • iOS编译提示和导航提示
  • Js基础——数据类型之Null和Undefined
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Promise面试题2实现异步串行执行
  • python3 使用 asyncio 代替线程
  • SpingCloudBus整合RabbitMQ
  • Spring框架之我见(三)——IOC、AOP
  • 测试开发系类之接口自动化测试
  • 关于使用markdown的方法(引自CSDN教程)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 深度学习入门:10门免费线上课程推荐
  • 思考 CSS 架构
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我从编程教室毕业
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #Linux(make工具和makefile文件以及makefile语法)
  • #Ubuntu(修改root信息)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Git) gitignore基础使用
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (黑马点评)二、短信登录功能实现
  • (五)Python 垃圾回收机制
  • (原)Matlab的svmtrain和svmclassify
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .