在 json 列中使用双引号和反斜杠按键提取值

Extract value by key with double quote and backslash in json column

我有一个 table 包含这样的数据

| id | jdoc                                |
+----+-------------------------------------------+
|  1 | {"simple": "val1", "h\"simple": "val2"}   |
|  1 | {"simple": "val1", "h\"simple": "val2"}   |
|  1 | {"simple": "val1", "h\\"simple": "val2"} |
+----+-------------------------------------------+

jdoc 是 json 格式的列,我正在尝试按键获取值。

我可以通过 运行 查询 select jdoc->'$."simple"' from test2 ;

使用键 simple 获取值

但类似的查询无法检索键的值 "h\"simple" 比如查询select jdoc->'$."h\"simple"' from test2 ;return一个null的列表,这很明显说明查询没有击中右键。

| jdoc->'$."h\"simple"' |
+-----------------------------+
| NULL                        |
| NULL                        |
| NULL                        |
+-----------------------------+

此外,我尝试基于以下条件对双引号和反斜杠进行转义查询:https://dev.mysql.com/doc/refman/8.0/en/string-literals.html.

select jdoc->'$."h\\"simple"' from test2 ;

但它抱怨 ERROR: 3143 (42000): Invalid JSON path expression. The error is around character position 13.

关于如何使用双引号和反斜杠等特殊字符查询此类键,有什么建议吗?

这是一个测试:

mysql> select json_extract(cast('{"simple": "val1", "h\"simple": "val2"}' as json),
    '$."h\"simple"') as h_simple;
+----------+
| h_simple |
+----------+
| "val2"   |
+----------+

您需要在 JSON 路径表达式中使用文字 \,以便将 " 转义为 JSON。但是 MySQL 字符串将反斜杠视为特殊字符,因此您必须使用双反斜杠来确保单个文字反斜杠能够通过 MySQL 的字符串文字解析器。