Flink CDC系列之:Kafka 变更日志 JSON 格式工厂类 ChangeLogJsonFormatFactory

这是一个 变更日志 JSON 格式工厂类,负责根据配置创建不同类型的 JSON 序列化器。

类概述

java 复制代码
@Internal
public class ChangeLogJsonFormatFactory
  • @Internal:标记为内部类,不推荐用户直接使用
  • 工厂模式:根据配置参数创建对应的 JSON 序列化器实例

核心方法详解
createSerializationSchema() - 创建序列化器

java 复制代码
public static SerializationSchema<Event> createSerializationSchema(
        ReadableConfig formatOptions, 
        JsonSerializationType type, 
        ZoneId zoneId) {

参数说明:

  • formatOptions:格式配置选项
  • type:JSON 序列化类型(Debezium 或 Canal)
  • zoneId:时区配置

配置解析流程

构建配置前缀

java 复制代码
final String prefix = type.toString() + ".";

作用:根据序列化类型构建配置项的前缀。

示例:

  • Debezium: "debezium-json."
  • Canal: "canal-json."

解析 Debezium Schema 包含配置

java 复制代码
boolean isIncludedDebeziumSchema =
        Boolean.parseBoolean(
                formatOptions
                        .toMap()
                        .get(
                                DEBEZIUM_JSON_INCLUDE_SCHEMA_ENABLED
                                        .key()
                                        .substring(prefix.length())));

配置键处理:

  • 完整配置键:debezium-json.include-schema.enabled
  • 去掉前缀后:include-schema.enabled
  • 从配置映射中获取值

解析通用 JSON 格式配置

时间戳格式

java 复制代码
TimestampFormat timestampFormat = JsonFormatOptionsUtil.getTimestampFormat(formatOptions);

选项:

  • SQL:"2023-11-24 15:30:00"
  • ISO-8601:"2023-11-24T15:30:00Z"

Map中null键处理模式

java 复制代码
JsonFormatOptions.MapNullKeyMode mapNullKeyMode =
        JsonFormatOptionsUtil.getMapNullKeyMode(formatOptions);

模式:

  • DROP:丢弃null键
  • FAIL:抛出异常
  • LITERAL:使用指定文本替换

Map中null键替换文本

java 复制代码
String mapNullKeyLiteral = formatOptions.get(JSON_MAP_NULL_KEY_LITERAL);

示例:"null", "NULL", ""

Decimal编码方式

java 复制代码
final boolean encodeDecimalAsPlainNumber =
        formatOptions.get(ENCODE_DECIMAL_AS_PLAIN_NUMBER);
  • true:123.45 → 123.45
  • false:123.45 → "123.45"

忽略null字段

java 复制代码
final boolean ignoreNullFields =
        JsonRowDataSerializationSchemaUtils.enableIgnoreNullFields(formatOptions);
  • true:忽略null字段,不输出到JSON
  • false:包含null字段,输出为null

序列化器创建逻辑
Debezium JSON 序列化器

java 复制代码
case DEBEZIUM_JSON:
    {
        return new DebeziumJsonSerializationSchema(
                timestampFormat,           // 时间戳格式
                mapNullKeyMode,            // null键处理模式
                mapNullKeyLiteral,         // null键替换文本
                zoneId,                    // 时区
                encodeDecimalAsPlainNumber, // Decimal编码方式
                ignoreNullFields,          // 是否忽略null字段
                isIncludedDebeziumSchema); // 是否包含Schema信息
    }

额外参数:isIncludedDebeziumSchema

  • 控制是否在输出中包含表结构信息
  • 仅 Debezium 格式支持此特性

实际使用场景
场景1:完整数据同步

java 复制代码
// 使用 Debezium 格式,包含Schema信息
ReadableConfig config = Configuration.fromMap(
    "debezium-json.include-schema.enabled" -> "true",
    "debezium-json.timestamp-format" -> "ISO-8601"
);

SerializationSchema<Event> schema = 
    ChangeLogJsonFormatFactory.createSerializationSchema(
        config, 
        JsonSerializationType.DEBEZIUM_JSON, 
        ZoneId.of("UTC"));

总结:ChangeLogJsonFormatFactory 是一个配置驱动的工厂类,它:

✅ 统一创建接口:为不同 JSON 格式提供一致的创建方式

✅ 完整配置支持:解析所有 JSON 格式相关的配置选项

✅ 类型安全:通过枚举确保只创建支持的序列化器类型

✅ 易于扩展:支持添加新的 JSON 格式序列化器

✅ 生产就绪:包含完整的错误处理和配置验证

这个工厂类使得 Flink CDC 能够灵活地支持多种 JSON 格式,满足不同业务场景和数据集成需求。

相关推荐
C_心欲无痕16 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
REDcker1 天前
AIGCJson 库解析行为与异常处理指南
c++·json·aigc·c
全栈前端老曹1 天前
【包管理】read-pkg-up 快速上手教程 - 读取最近的 package.json 文件
前端·javascript·npm·node.js·json·nrm·package.json
半熟的皮皮虾1 天前
又重新写了个PDF工具箱-转换office格式/合并/拆分/删除常见操作都有了
python·程序人生·pdf·flask·开源·json·学习方法
我的golang之路果然有问题1 天前
python中 unicorn 热重启问题和 debug 的 json
java·服务器·前端·python·json
kupeThinkPoem2 天前
QJsonObject能否嵌套查找?
qt·json
BD_Marathon2 天前
SpringMVC——json数据传递参数
json
程序员欣宸2 天前
LangChain4j实战之十二:结构化输出之三,json模式
java·人工智能·ai·json·langchain4j
秃了也弱了。2 天前
FASTJSON库:阿里出品java界json解析库,使用与踩坑记录
java·开发语言·json
..过云雨2 天前
应用层自定义协议与序列化一站式指南
网络协议·tcp/ip·json·信息与通信