Flink处理JSON字符串时=、&符号被转义为Unicode编码如何解决?
Flink JSON输出=、&等符号被转义为Unicode的解决方案
根因说明
该问题由Flink默认采用的Jackson JSON序列化框架的默认配置导致:Jackson默认开启了HTML敏感字符转义规则,会自动将=、&、<、>等特殊字符转义为Unicode编码,部分版本同时默认开启非ASCII字符转义,进一步加剧了该问题。
解决方案
场景1:使用Flink官方JsonSerializationSchema进行流数据序列化
构建序列化实例时新增Jackson配置即可:
JsonSerializationSchema<你的POJO类名> serializationSchema = JsonSerializationSchema .builder(你的POJO类名.class) .configure(objectMapper -> { // 关闭非ASCII字符转义 objectMapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false); // 关闭HTML敏感字符转义,避免=、&被转义 objectMapper.disable(SerializationFeature.WRITE_ESCAPED_HTML_CHARS); }) .build();
场景2:自定义逻辑中自行维护ObjectMapper实例
初始化ObjectMapper时直接添加对应配置:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; // 初始化全局ObjectMapper实例 ObjectMapper objectMapper = new ObjectMapper() .configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false) .disable(SerializationFeature.WRITE_ESCAPED_HTML_CHARS);
场景3:Flink SQL使用JSON格式输出
在建表WITH参数中添加JSON格式配置即可:
CREATE TABLE 输出表名 ( body STRING, -- 其余字段定义 ) WITH ( 'connector' = '你的输出连接器', 'format' = 'json', 'json.escape-non-ascii' = 'false', 'json.disable-html-escaping' = 'true' );
配置完成后重新提交作业,输出的JSON字符串就会保留原始的=、&符号,不会再被转义为Unicode编码。
内容的提问来源于stack exchange,提问作者Dario Riviezzo
相关产品推荐
相关产品推荐

