提问人:Sahil Minocha 提问时间:8/25/2018 更新时间:7/29/2022 访问量:5887
MySQL 5.7 JSON_EXTRACT不适用于对象中的带引号的字符串:[ERROR] “字符串中缺少右引号”
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函数提取带引号的字符串。
输入示例:
{
"email": "d'[email protected]",
"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)
我收到一个错误,指出:参数 1 中的 JSON 文本无效,函数 json_extract:“字符串中缺少右引号。
任何帮助将不胜感激,谢谢!
答:
这是对我有用的修复程序: 我使用运算符“-->”而不是 JSON_UNQUOTE(JSON_EXTRACT(“jsonString”)),它没有给我输入字符串中任何类型的引号带来任何错误。请注意,上面的示例 JSON 只是我在输入中期望的用例之一。我有大约 400 万条记录,具有字符和引号的所有不同组合,因为它包含电子邮件正文,并且使用运算符而不是实际命令工作得很好,这很奇怪,因为两者本质上是相同的,但我很高兴我可以使用一个小修复来解决它。
{
@valid_json := JSON_VALID(inputString),
IF(@valid_json, inputString ->> '$.email', NULL) AS EMAIL,
}
您收到此错误是因为字段“inputString”中的内容对于某些记录是无效的 JSON。我认为盲目地处理这个错误而不为下游/未来用户保留任何错误消息是错误的。
这种方法可能是可以接受的(尽管我不会接受数据工程师的这种做法)。更好的解决方案是在 IF 语句中放置一个信息量更大的错误,而不是一个 null,也许是这样的
CONCAT_WS(“ ”, '格式不正确的 JSON :', inputString),这样你的整个函数就变成了
IF(valid_json(inputString), input_string ->> '$.email', CONCAT_WS(“ ”, '格式不正确的 JSON :', inputString)) 作为 EMAIL。
这样,任何下游用户都将能够识别可能影响结论有效性的任何潜在数据质量问题。按照这些思路,可能值得拥有一个完全独立的字段,例如
JSON_VALID(inputString) AS INPUT_JSON_VALID,可用于更轻松的下游筛选。
评论
JSON_VALID
NULL
JSON_VALID()
SELECT
IF()