雪花响应 Json 有空格?

问题描述 投票:0回答:2

这是一个选择对象的简单雪花查询:

sf = connection.cursor()

sf.execute(f"""
SELECT OBJECT_CONSTRUCT('foo', 'bar')
""")

for row in sf.fetchall():
    yield row

当我运行此命令时,响应似乎是:

['{\n"foo": "bar"\n}']

带有空白字符等。理想情况下,它会以字典的形式返回,但如果不可能的话,它可以不带空格地返回吗?

python snowflake-cloud-data-platform
2个回答
1
投票

Snowflake 使用换行符和缩进格式化 JSON。这将使它返回时没有换行、缩进或空格:

   sf.execute(f"""
SELECT OBJECT_CONSTRUCT('foo', 'bar')::string
""")

0
投票

在问题的示例中,Snowflake SQL 返回一个 VARIANT。该转换是在 Python 级别完成的。如果你想控制 Snowflake SQL 中的转换,你可以使用 TO_JSON,它目前不添加行结尾或空格(或者使用 :: 或 CAST 的隐式转换,它应该在幕后执行相同的操作)。

SELECT 
    OBJECT_CONSTRUCT('foo', 'bar') as obj, 
    TO_JSON(obj) as obj_string,
    -- implicit conversions, not the best practice
    obj::STRING,
    CAST(obj as STRING)
-- result: {"foo":"bar"}

我需要相反的东西,所以我在 Javascript 中编写了一个原始函数,因为 JSON.stringify 可以更好地控制从对象(VARIANT)到字符串的转换。

CREATE OR REPLACE FUNCTION UDF_JSON_TO_STRING(P_JSON VARIANT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
/*
   Makes JSON a well-formatted string as opposed to the default  Snowflake function TO_JSON
*/
AS '
    return JSON.stringify(P_JSON, null, 2)
  ';

现在我可以处理漂亮且可读的 JSON 字符串。调试大型 JSON 时,优势变得明显。

  SELECT UDF_JSON_TO_STRING(OBJECT_CONSTRUCT('foo', 'bar'));

/* result: {
  "foo": "bar"
} */
© www.soinside.com 2019 - 2024. All rights reserved.