{"record":{"id":"0bbffa09273c9883","repo":"apache/seatunnel","slug":"common-02-0bbffa","errorCode":"COMMON-02","errorMessage":"Json JSON convert/parse '<payload>' operation failed.","messagePattern":"Json JSON convert/parse '<payload>' operation failed\\.","errorType":"error_code","errorClass":"SeaTunnelRuntimeException","httpStatus":null,"severity":"error","filePath":"seatunnel-formats/seatunnel-format-json/src/main/java/org/apache/seatunnel/format/json/debezium/DebeziumJsonDeserializationSchemaDispatcher.java","lineNumber":102,"sourceCode":"            String table = getNodeValue(source, TABLE);\n            TablePath tablePath = TablePath.of(database, schema, table);\n            if (tableDeserializationMap.containsKey(tablePath)) {\n                tableDeserializationMap.get(tablePath).parsePayload(out, payload);\n            } else {\n                if (isConnectorCanWithOutDB(source.get(CONNECTOR))) {\n                    tablePath = TablePath.of(null, schema, table);\n                    if (tableDeserializationMap.containsKey(tablePath)) {\n                        tableDeserializationMap.get(tablePath).parsePayload(out, payload);\n                        return;\n                    }\n                }\n                log.debug(\"Unsupported table path {}, just skip.\", tablePath);\n            }\n\n        } catch (Exception e) {\n            // a big try catch to protect the processing.\n            if (!ignoreParseErrors) {\n                throw CommonError.jsonOperationError(FORMAT, new String(message), e);\n            }\n        }\n    }\n\n    private static String getNodeValue(JsonNode source, String key) {\n        return source.has(key) && !source.get(key).isNull() ? source.get(key).asText() : null;\n    }\n\n    private JsonNode getPayload(JsonNode jsonNode) {\n        if (debeziumEnabledSchema) {\n            return jsonNode.get(DATA_PAYLOAD);\n        }\n        return jsonNode;\n    }\n\n    private boolean isConnectorCanWithOutDB(JsonNode connectorNode) {\n        if (connectorNode == null || connectorNode.isNull()) {\n            return true;","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-formats/seatunnel-format-json/src/main/java/org/apache/seatunnel/format/json/debezium/DebeziumJsonDeserializationSchemaDispatcher.java#L84-L120","documentation":"The Debezium deserialization dispatcher wraps any Exception raised while routing a Debezium event to a per-table handler into jsonOperationError, unless ignoreParseErrors is set. The raw message bytes are embedded in the message. It is thrown when the event cannot be parsed, its table path cannot be resolved, or the matched table's converters fail on the payload.","triggerScenarios":"deserialize(byte[] message, Collector<SeaTunnelRow>) encounters an event whose table identification (database/table keys in 'source') or payload shape breaks the table-path lookup or row conversion for the matched table.","commonSituations":"Multi-table Debezium streams where one table's schema drifted; topic routing/regex (table-name regex config) not matching the event's tablePath and then conversion assumptions failing; renamed or newly added tables not present in the configured schema.","solutions":["Check the 'Unsupported table path' debug log and the payload in the error to identify which table event failed","Add or update the table's schema in the connector configuration so converters match the event's columns","Fix the topic/table-path regex configuration so events are routed to the right schema handler","Enable ignore-parse-errors for tables intentionally excluded from the pipeline"],"exampleFix":"// before: schema only for table A, stream contains B\n[{\n  table-names = [\"db.a\"]\n}]\n// after: include and declare the new table\n[{\n  table-names = [\"db.a\", \"db.b\"],\n  schema = { ... db.b columns ... }\n}]","handlingStrategy":"validation","validationCode":"// check table identity exists before routing\nString db = getNodeValue(root.get(\"source\"), \"db\");\nString tbl = getNodeValue(root.get(\"source\"), \"table\");\nif (db == null || tbl == null) throw new SkipRecordException();","typeGuard":"boolean hasTablePath(JsonNode event) {\n    JsonNode s = event == null ? null : event.get(\"source\");\n    return s != null && s.hasNonNull(\"db\") && s.hasNonNull(\"table\");\n}","tryCatchPattern":"try {\n    dispatcher.deserialize(message, out);\n} catch (SeaTunnelRuntimeException e) {\n    log.warn(\"Skip event for unroutable/unknown table\", e);\n}","preventionTips":["Include every streamed table in connector table list/schema config","Verify table-path regex matches 'db.table' naming used by Debezium","Monitor 'Unsupported table path' warnings to catch new tables early","Use ignore-parse-errors when intentionally excluding tables"],"tags":["json","cdc","debezium","routing"],"backgroundTag":"json-parse-error","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}