簡體   English   中英

MySQL 5.7 JSON_EXTRACT 不適用於 object 中的帶引號的字符串:[錯誤]“字符串中缺少右引號”

[英]MySQL 5.7 JSON_EXTRACT does not work with quoted strings within the object: [ERROR] "Missing a closing quotation mark in string"

我無法在 MySQL 5.7 中使用 JSON_EXTRACT function 提取帶引號的字符串。

樣本輸入:

{
    "email": "d'souza@email.com",
    "body": "I may have "random quotes '(single)/(double)" " in my source data"
}

嘗試使用,

SELECT 
@valid_source := JSON_VALID(jsonString), NULL
IF(@valid_source, JSON_UNQUOTE(JSON_EXTRACT(jsonString, "$.email")), NULL)

我收到一條錯誤消息: function json_extract 的參數 1 中的 JSON 文本無效:“字符串中缺少右引號。” 在 position xxx

任何幫助將不勝感激,謝謝

這是對我有用的修復程序:我使用運算符“->”代替JSON_UNQUOTE(JSON_EXTRACT(“ jsonString”)),並且對於輸入字符串中的任何類型的引號,都不會引發任何錯誤。 請注意,上面的Sample JSON只是我在輸入中期望的用例之一。 我大約有400萬條記錄,具有字符和引號的所有不同組合,因為它包含電子郵件正文,並且使用運算符而不是實際命令可以很好地工作,這很奇怪,因為兩者基本相同,但我對它的滿意程度始終不減我可以使用一個小的修復程序來解決它。

{
@valid_json := JSON_VALID(inputString),
IF(@valid_json, inputString ->> '$.email', NULL) AS EMAIL,
}

您收到此錯誤是因為“inputString”字段中的內容對於某些記錄是無效的 JSON。 我認為盲目地處理此錯誤而不為下游/未來用戶保留任何錯誤消息是錯誤的。

這種方法可能是可以接受的(盡管我不會接受數據工程師的這種做法)。 更好的解決方案是在 IF 語句中添加更多信息錯誤,而不是 null,可能類似於

CONCAT_WS(" ", 'INCORRECTLY FORMED JSON:', inputString),這樣你的整體 function 就變成了

IF(valid_json(inputString), input_string ->> '$.email', CONCAT_WS(" ", 'INCORRECTLY FORMED JSON:', inputString)) 為 EMAIL。

這樣,任何下游用戶都將能夠識別任何可能影響結論有效性的潛在數據質量問題。 按照這些思路,可能值得擁有一個完全獨立的領域,例如

JSON_VALID(inputString) AS INPUT_JSON_VALID,可用於更輕松的下游過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM