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"

提问人:Sahil Minocha 提问时间:8/25/2018 更新时间:7/29/2022 访问量:5887

问:

我无法在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:“字符串中缺少右引号。

任何帮助将不胜感激,谢谢!

mysql sql json 引用 mysql-5.7

评论

1赞 Raymond Nijland 8/25/2018
Wierd 错误,因为我不相信 JSON 应该传递该函数JSON_VALID
0赞 sticky bit 8/25/2018
您的查询中有一个杂散,但这应该会产生另一个错误。确定您发布了正确的查询?因为除此之外,它对我有用:rextester.com/DVZ80948NULL
0赞 Sahil Minocha 8/25/2018
谢谢你们的回复。查询是我正在使用的,但是示例数据可能不同。我正在查询超过 500 万条记录,在 SELECT 查询之间出现此错误。不确定,是否只是因为角落用例,或者查询本身不正确。
0赞 Michael - sqlbot 8/26/2018
这里的JSON非常明显地违反了规范。目前尚不清楚你是否意识到这一点。如果真的返回 true,那是 mysql 中的一个错误,但是使用用户定义的变量进行赋值不是确定的,因此您编写的查询实际上并不能证明@valid_source在计算之前被设置为 true,如果有的话。JSON_VALID()SELECTIF()
0赞 Sahil Minocha 8/27/2018
这是对我有用的修复程序:我使用运算符“-->”而不是 JSON_UNQUOTE(JSON_EXTRACT(“jsonString”)),它没有给我输入字符串中任何类型的引号带来任何错误。请注意,上面的示例 JSON 只是我在输入中期望的用例之一。我有大约 400 万条记录,具有所有不同的字符组合,并且使用运算符而不是实际命令工作得很好,这很奇怪,因为两者都是相同的,但我很高兴我可以使用一个小修复来解决它。

答:

1赞 Sahil Minocha 8/27/2018 #1

这是对我有用的修复程序: 我使用运算符“-->”而不是 JSON_UNQUOTE(JSON_EXTRACT(“jsonString”)),它没有给我输入字符串中任何类型的引号带来任何错误。请注意,上面的示例 JSON 只是我在输入中期望的用例之一。我有大约 400 万条记录,具有字符和引号的所有不同组合,因为它包含电子邮件正文,并且使用运算符而不是实际命令工作得很好,这很奇怪,因为两者本质上是相同的,但我很高兴我可以使用一个小修复来解决它。

{
@valid_json := JSON_VALID(inputString),
IF(@valid_json, inputString ->> '$.email', NULL) AS EMAIL,
}
0赞 Brad Davis 7/29/2022 #2

您收到此错误是因为字段“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,可用于更轻松的下游筛选。