Clickhouse生成JSON时如何处理含反斜杠的字段?
解决ClickHouse中含反斜杠字段拼接JSON无效的问题
普通String列场景
手动拼接JSON时的核心问题是:直接字符串拼接无法自动处理JSON特殊字符的转义规则,且SQL层面的反斜杠转义逻辑会让replace操作极易出错。
最稳妥的解决方案是放弃手动拼接,直接使用ClickHouse内置的toJSONString函数——它会自动处理所有JSON特殊字符(包括反斜杠、双引号等)的转义:
示例代码
-- 创建表并插入测试数据(插入时的双反斜杠是SQL层面的转义,存储后为单个反斜杠) CREATE TABLE app_events.al_test (id UInt64, content String) ENGINE = MergeTree() ORDER BY id; INSERT INTO app_events.al_test VALUES (1, 'test\\data'); -- 生成合法JSON的正确方式 SELECT toJSONString(map('id', id, 'content', content)) AS json_result FROM app_events.al_test;
执行后会输出符合JSON规范的结果:{"id":1,"content":"test\\data"}
如果一定要手动拼接(不推荐),需要做双重转义处理:
SELECT concat('{"content": "', replace(content, '\\', '\\\\'), '"}') AS json_result FROM app_events.al_test;
这里replace中第一个\\匹配存储的单个反斜杠,第二个\\\\会被SQL解析为JSON所需的双反斜杠。但这种方式维护成本高,优先用内置函数。
Array(String)列场景
用arrayMap+arrayStringConcat手动拼接数组JSON时,同样会因转义规则冲突导致JSON无效,依旧依赖内置函数解决:
示例代码
-- 创建含数组字段的表并插入测试数据 CREATE TABLE app_events.al_array_test (id UInt64, tags Array(String)) ENGINE = MergeTree() ORDER BY id; INSERT INTO app_events.al_array_test VALUES (1, ['tag\\1', 'tag\\2']); -- 直接将数组转为合法JSON格式 SELECT toJSONString(map('id', id, 'tags', tags)) AS json_result FROM app_events.al_array_test;
输出结果为合法JSON:{"id":1,"tags":["tag\\1","tag\\2"]}
如果需要自定义数组拼接逻辑,可在arrayMap中用toJSONString处理每个元素:
SELECT concat('[', arrayStringConcat(arrayMap(x -> toJSONString(x), tags), ','), ']') AS array_json FROM app_events.al_array_test;
每个数组元素都会被正确转义,拼接后的数组JSON完全合规。
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

