在 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 的字符串文字解析器。
我有一个 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 的字符串文字解析器。