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 格式,满足不同业务场景和数据集成需求。

相关推荐
Filotimo_1 分钟前
在java开发中:JSON序列化和JSON反序列化
java·microsoft·json
流星白龙19 分钟前
7.YAML和JSON Schema
json·接口测试
wtsolutions25 分钟前
Sheet-to-Doc 支持 JSON 和 JSONL 格式:批量生成 Word 文档的新方式
json·word·wtsolutions·sheet-to-doc
Slow菜鸟3 小时前
Java基础 | JSON 处理手册
java·开发语言·json
小鸡吃米…1 天前
Python - JSON
开发语言·python·json
武藤一雄2 天前
一款基于WPF开发的BEJSON转换工具
windows·c#·json·wpf
联系QQ 180809512 天前
基于SVPWM改进的异步电机/感应电机直接转矩控制:解决传统DTC转矩纹波大的问题“ 参考文...
json
娱乐我有2 天前
北京深梵科技公益捐赠二十万 赋能流浪动物温暖过冬
人工智能·科技·json
charlee442 天前
使用cpp-httplib发布HTTP服务
c++·http·json·cpp-httplib
就是有点傻2 天前
ASP.NET Core Web API中的launchSettings.json介绍
json·asp.net