這是有效的 JSON(我已經針對兩個 JSON 驗證器運行它并使用 powershell 對其進行了決議):
{
"actionCD": "error",
"NotesTXT": "\"Exception call timeout\""
}
這不是有效的 JSON:
{
"actionCD": "error",
"NotesTXT": "\\"Exception call timeout\\""
}
但是,第一個示例中的 parse_json 函式會失敗:
SELECT '{ "actionCD": "error", "NotesTXT": "\"Exception call timeout\"" }' as json_str
,PARSE_JSON(json_str) as json;
Error parsing JSON: missing comma, pos 38
出乎意料的是,雪花 parse_json 函式適用于無效的json:
SELECT '{ "actionCD": "error", "NotesTXT": "\\"Exception call timeout\\"" }' as json_str
,PARSE_JSON(json_str) as json;
<No Errors>
這讓我非常困惑和不確定如何進行。我正在使用 powershell 以編程方式創建有效的 JSON,然后嘗試使用將有效的JSON 插入雪花INSERT INTO ()...SELECT ...
這是我試圖在 powershell 中構建的插入陳述句:
INSERT INTO DBNAME.SCHEMANAME.TABLENAME(
RunID
,jsonLogTXT
) SELECT
'$RunID'
,parse_json('$($mylogdata | ConvertTo-Json)')
;
# where $($mylogdata | ConvertTo-Json) outputs valid json, and from time-to-time includes \" to escape the double quotes.
# But snowflake fails because snowflake wants \\" to escape the double quotes.
這是預期的嗎?(顯然我發現它出乎意料:-))。這里有什么建議?(我是否應該在 powershell 中搜索我的 json-stored-as-a-string 中的“并用 \” 替換它,然后再將其發送到雪花?但這感覺真的很hacky?)
uj5u.com熱心網友回復:
您發布的代碼顯示了答案:
SELECT '{ "actionCD": "error", "NotesTXT": "\\"Exception call timeout\\"" }' as json_str
,PARSE_JSON(json_str) as json;
| JSON_STR | JSON |
|---|---|
| { "actionCD": "error", "NotesTXT": ""例外呼叫超時"" } | { "NotesTXT": ""例外呼叫超時"", "actionCD": "error" } |
您看到的不是“您輸入的”,因此 PARSE_JSON 正在決議的是您注意到的“有效 JSON”
答案對許多計算機環境來說很常見,那就是環境正在讀取您的輸入,并且它會作用于其中的一些,因此 SQL 決議器正在讀取您的 SQL,它會看到\有效 json 中的單個并認為您正在開始一個轉義序列,然后抱怨逗號在錯誤的位置。
BASH(或 PowerShell)、Python 甚至 Java 都要求您了解字串內容(也就是您的有效 JSON)與您必須如何表示它以使其通過語言決議器之間的區別。
那么應該如何“在雪花中插入 JSON”一個通用的答案不是通過 INSERT 命令,如果它是高容量的。或者,如果您不想使字串決議器安全,您可以對資料進行 BASE64 編碼(在 powershell 中)并插入base64_decode(awesomestring)
看起來像eyAiYWN0aW9uQ0QiOiAiZXJyb3IiLCAiTm90ZXNUWFQiOiAiXCJFeGNlcHRpb24gY2FsbCB0aW1lb3V0XCIiIH0=這樣
SELECT PARSE_JSON(base64_decode_string('eyAiYWN0aW9uQ0QiOiAiZXJyb3IiLCAiTm90ZXNUWFQiOiAiXCJFeGNlcHRpb24gY2FsbCB0aW1lb3V0XCIiIH0=')) as json_from_B64;
給出:
| JSON_FROM_B64 |
|---|
| { "NotesTXT": ""例外呼叫超時"", "actionCD": "error" } |
uj5u.com熱心網友回復:
這在很大程度上是意料之中的。在 JSON 決議發生之前,雪花字串使用反斜杠作為轉義字符。
因此:"\\"content\\""將被雪花決議為"\"content\""將被輸入 JSON 決議器的內容,并被視為有效的 JSON。
類似的問題可以用單引號提出。
在將其發送到雪花之前替換\為\\可能會起作用,盡管當我遇到這些型別的問題時,我發現它通常伴隨著其他加密/決議錯誤。例如,我發現更改方法并讓雪花決議具有 JSON 的檔案通常更合適。那么你就沒有額外的轉義字符了。不過,這對您的流程來說是一個更大的變化。
Snowflake 的檔案在這里對此主題進行了快速說明:https ://docs.snowflake.com/en/sql-reference/functions-regexp.html#escape-characters-and-caveats
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432478.html
