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

相关推荐
nexustech6 小时前
simplejson:Python JSON 处理的备用引擎
开发语言·python·其他·json
m0_497048931 天前
Prompt工程:从自然语言到代码化思维
json
ID_180079054731 天前
淘宝商品评论 API(taobao.item.reviews.get)业务场景与 JSON 返回实战
json
PixelBai1 天前
JSON差异比较高级用法技巧
java·服务器·json
hhzz1 天前
Uniapp项目中解决一个比较典型的图标渲染问题:原生 tabBar(pages.json 里配置的那种)
uni-app·json
Ajie'Blog1 天前
2026年AI安全与治理:从幻觉到系统性欺骗的攻防之战
javascript·人工智能·安全·rpc·json·rag
PixelBai2 天前
JSON差异比较对比指南
json
珺毅同学2 天前
YOLO生成预测json标签迁移问题
python·yolo·json
PixelBai2 天前
JSON差异比较集成指南与工作流自动化
运维·自动化·json
PixelBai2 天前
JSON差异比较性能评测与优化建议
json