从Snowflake获取JSON数据到Python格式不符 如何正确写入JSON文件
问题根因
Snowflake Python连接器默认会对查询返回的VARIANT、OBJECT、ARRAY类型的JSON数据做自动反序列化,转成Python原生的字典、列表对象;而Snowflake控制台直接返回未经过二次解析的原始JSON字符串,两者的格式差异是连接器默认类型转换逻辑导致的,和查询语句本身无关。你直接写入本地文件的内容和Python端拿到的错误格式一致,本质是写入时用的就是被自动转换过的Python对象,不是Snowflake返回的原始JSON。
可落地解决步骤
- 关闭连接器的JSON自动解析能力
初始化Snowflake连接时,传入json_deserializer=None参数即可关闭自动反序列化,示例连接代码:
如果你用SQLAlchemy对接Snowflake,初始化引擎时加对应连接参数即可:import snowflake.connector con = snowflake.connector.connect( user="你的账号", password="你的密码", account="你的账号标识", warehouse="计算仓库名", database="数据库名", schema="模式名", json_deserializer=None # 核心配置,关闭JSON自动解析 )create_engine(connection_url, connect_args={"json_deserializer": None})。如果不想修改连接配置,也可以在创建游标后执行cursor.execute("ALTER SESSION SET DISABLE_JSON_PARSER = TRUE"),在当前会话级别关闭JSON解析。 - 校验返回结果一致性
执行查询后,打印返回结果中JSON字段的类型,确认类型为str,且字符串内容和Snowflake控制台输出的原生JSON完全匹配,没有被转成Python字典/列表对象。 - 正确写入本地JSON文件
关闭自动解析后拿到的是原始JSON字符串,不要直接对字符串调用json.dump(),否则会给内容额外添加转义符:- 单条JSON结果直接按文本写入即可
- 多条结果需要组成JSON数组的,先逐行把字符串转成JSON对象,再统一序列化写入,参考代码:
cursor = con.cursor() cursor.execute("你的查询SQL") # 拿到所有结果,假设JSON字段的列名为NATIVE_JSON rows = cursor.fetchall() col_names = [desc[0] for desc in cursor.description] result_list = [dict(zip(col_names, row)) for row in rows] # 单条结果写入示例 with open("single_output.json", "w", encoding="utf-8") as f: f.write(result_list[0]["NATIVE_JSON"]) # 多条结果组成JSON数组写入示例 import json json_arr = [json.loads(row["NATIVE_JSON"]) for row in result_list] with open("multi_output.json", "w", encoding="utf-8") as f: json.dump(json_arr, f, ensure_ascii=False, indent=2)
常见避坑提示
- 不要在开启自动JSON解析的前提下,直接对Python dict/list做
json.dump()写入,会出现字段顺序变化、大整数精度丢失、空值/日期类型格式和Snowflake原生输出不一致的问题。 - 如果要求100%对齐Snowflake控制台的JSON输出格式(包括缩进、字段顺序、数值精度),优先选择关闭自动解析拿原始字符串的方案,不要依赖连接器的自动类型转换。
内容的提问来源于stack exchange,提问作者Jaho0na
相关产品推荐
相关产品推荐

