apache/seatunnel · error · SeaTunnelJsonFormatException
UNSUPPORTED_DATA_TYPE
UNSUPPORTED_DATA_TYPE
Error message
unsupported parse type: ${type} What it means
RowToJsonConverters.createNotNullConverter only implements converters for known SeaTunnel data types (ROW, ARRAY, MAP, primitives, etc.); any other/unmapped type reaches the default branch and fails with UNSUPPORTED_DATA_TYPE. It means the serializer cannot translate this SeaTunnel type into JSON.
Source
Thrown at seatunnel-formats/seatunnel-format-json/src/main/java/org/apache/seatunnel/format/json/RowToJsonConverters.java:223
ISO_LOCAL_DATE_TIME.format(
((OffsetDateTime) value).toLocalDateTime()));
}
};
}
return new RowToJsonConverter() {
@Override
public JsonNode convert(ObjectMapper mapper, JsonNode reuse, Object value) {
return mapper.getNodeFactory()
.textNode(ISO_OFFSET_DATE_TIME.format((OffsetDateTime) value));
}
};
case ARRAY:
return createArrayConverter((ArrayType) type);
case MAP:
MapType mapType = (MapType) type;
return createMapConverter(mapType.getKeyType(), mapType.getValueType());
default:
throw new SeaTunnelJsonFormatException(
CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,
"unsupported parse type: " + type);
}
}
private RowToJsonConverter createRowConverter(SeaTunnelRowType rowType) {
final RowToJsonConverter[] fieldConverters =
Arrays.stream(rowType.getFieldTypes())
.map(
new Function<SeaTunnelDataType<?>, Object>() {
@Override
public Object apply(SeaTunnelDataType<?> seaTunnelDataType) {
return createConverter(seaTunnelDataType);
}
})
.toArray(
new IntFunction<RowToJsonConverter[]>() {
@OverrideView on GitHub (pinned to cf67b549a7)
Solutions
- Check the SeaTunnelRowType field types feeding the JSON serialization and cast unsupported fields to supported types (e.g. STRING, INT, ARRAY)
- Upgrade seatunnel-formats/seatunnel-format-json to a version that supports the data type
- Convert the unsupported type to a supported one upstream with a transform before the JSON sink
- If a legitimate type is unsupported, extend createNotNullConverter with a case for it
Example fix
// before
Transform: field kept as Map<ArrayType...> unsupported by JSON converter
// after
sql { sql = "SELECT CAST(complex_field AS STRING) AS complex_field FROM source_table" } Defensive patterns
Strategy: type-guard
Validate before calling
for (DataField f : rowType.getFields()) {
if (!SUPPORTED_JSON_TYPES.contains(f.getDataType().getSqlType())) {
throw new IllegalStateException("Type not JSON-serializable: " + f.getDataType());
}
} Type guard
switch (type.getSqlType()) { case STRING: case INT: case BIGINT: case ARRAY: case MAP: case ROW: /* supported */ break; default: /* cast upstream */ } Try / catch
try { converter = rowToJsonConverters.createConverter(rowType); } catch (SeaTunnelJsonFormatException e) { if (e.getSeaTunnelErrorCode() == CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE) { /* cast field or upgrade */ } else { throw e; } } Prevention
- Cast complex/exotic types to STRING before a JSON-format sink
- Check supported types in RowToJsonConverters when designing pipeline types
- Keep seatunnel-formats modules on the same version as seatunnel-api
- Use a Transform (SQL CAST) to normalize types before serialization
When it happens
Trigger: Converting a SeaTunnelRow to JSON where the row type contains a data type not handled by the converter's switch (e.g. an unsupported or newly added SeaTunnelDataType reaching createConverter -> createNotNullConverter).
Common situations: Using a connector/transform output with exotic types (e.g. new type variants added to the API after this format was written) as sink input for JSON format; mismatched type declarations in config; older format module paired with newer API types.
Related errors
- array inject error, unsupported data type: " + type
- Unsupported type in LocalTimeArrayType: ${eleSqlType}
- Unsupported type: ${sqlType}
- Unsupported type: ${clazz}
- UNSUPPORTED_TYPE
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/fc552fdfb2d59d0e.
Report an issue: GitHub.