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

相关推荐
丨白色风车丨1 天前
Python中JSON与字典/列表的相互转换详解
windows·python·json
鱼宵2 天前
LangChain4j 结构化输出:让模型吐出 Java 对象,JSON 不再手写解析
java·开发语言·json·langchain4j
leisoo80972 天前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
mattleeee3 天前
CHANGELOG.md规范化管理:让每次变更都有迹可循
版本管理·changelog·变更记录
胖头鱼的鱼缸(尹海文)4 天前
胖头鱼的技术专栏-474 从能跑到能上线:PG SplitJSON 0.2.0 和 0.1.0 差在哪(20261008)
postgresql·json
?? Daisy4 天前
Claude Code 接入 GPT:settings.json 两种配置方法(2026-10)
gpt·json
小静AI工程实验室4 天前
Python 爬虫解析 JSON-LD:多块 script、@graph 与坏数据的 9 个边界
爬虫·python·json
goehou5 天前
LLM 结构化输出全解:从 Prompt 约束到 Schema 硬保证,三层实现怎么选
ai·llm·json·agent·教程·结构化输出
独立开发者阿乐5 天前
结构化数据 JSON-LD 实战:让 AI 读懂你的网页
人工智能·json·结构化数据·geo优化·json-ld·ai收录·faqpage
liangshanbo12157 天前
高级前端面试题:package.json 常见字段
前端·json