JsonCpp源码分析——Writer

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

2、Writer 类的核心功能是将 JSON 数据结构(如对象、数组、字符串和数字)序列化为 JSON 格式的字符串。它支持将 Json::Value 对象转换为 JSON 字符串,这些对象可以包含复杂的嵌套数据结构。

cpp 复制代码
#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 字符串,默认的配置如下,可以自行配置。

cpp 复制代码
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进行格式化:

cpp 复制代码
#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;
}
相关推荐
油炸自行车5 小时前
Claude Code 错误:API Error: 400 Failed to deserialize the JSON body into the
开发语言·javascript·json·trae·claude code·api error 400
NiceCloud喜云17 小时前
Claude Code 跑 HyperFrames 实测:本地生成 AI 视频素材全流程
java·运维·人工智能·自动化·json·音视频·飞书
逍遥德18 小时前
PostgreSQL --- JSON 函数详解
数据库·sql·postgresql·json
輕華20 小时前
Flask_GET请求与JSON响应实战详解
python·flask·json
NiceCloud喜云1 天前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
海兰1 天前
Kibana Dashboard as Code:Elastic 9.4 如何用 Terraform 和类型化 API 终结“JSON 垃圾袋“
云原生·json·terraform
前网易架构师-高司机2 天前
带标注的交警识别数据集,可识别交警和非交警,5587张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·交警
●VON2 天前
鸿蒙Flutter实战:放弃sqflite选纯Dart JSON文件存储
flutter·华为·json·harmonyos·鸿蒙
MageGojo2 天前
给起名工具接入八字起名 API:参数设计、JSON 示例和应用场景
json·apache
jieyucx2 天前
Go 语言 JSON 序列化/反序列化:Tag 用法完全指南
开发语言·golang·json·序列化·tag