JSON_TABLE - 如何访问转义引号内的字段?

问题描述 投票:0回答:1

我有一个很大的 JSON 字段,我正在尝试使用 JSON_TABLE 解析它。 大约一半的数据很简单,例如:

"run_summary":{"num_records":6,"num_runtime_errors":0,"num_checkpoint_failed":4,"num_files":4}

但另一半包含转义引号,例如:

"current_review_id":"{\"value\": \"b13d2f43-7abb-40f8-9867-6349c0c84c47\", \"recorded_timestamp\": 1696865721868}"

我可以轻松地从 run_summary 中分解列,即

num_records int PATH '$.run_summary.num_records'

但是,我不知道如何获取转义引号内的内容......这不起作用,例如:

value varchar(40) PATH  '$.flow_job_metrics.current_review_id.value' 

...它只返回 null。

我尝试在路径中添加额外的引号,例如:

 '$.flow_job_metrics.current_review_id."value"' 

以及其他疯狂的事情,例如:

 '$.flow_job_metrics.current_review_id.\"value\"' 

但是这些要么会导致语法错误,要么会导致更多空值。

任何人都可以帮我弄清楚如何获得这些吗?

mysql escaping mysql-json json-table
1个回答
0
投票

由于 JSON 实际上是双重编码的,也就是说,您的 JSON 的一部分只是一个字符串,它是“外部”JSON 文档的一部分,因此您必须对其进行双重解码:

create table mytable (
  id serial primary key,
  data json
);

insert into mytable set data = '{"current_review_id":"{\\"value\\": \\"b13d2f43-7abb-40f8-9867-6349c0c84c47\\", \\"recorded_timestamp\\": 1696865721868}"}';

select id, j1.current_review_id, j2.value, j2.recorded_timestamp from mytable
cross join json_table(data, '$' columns (
    current_review_id json path '$.current_review_id'
  )) as j1
cross join json_table(json_unquote(j1.current_review_id), '$' columns (
    value varchar(36) path '$.value',
    recorded_timestamp bigint path '$.recorded_timestamp'
  )) as j2;

输出,在 MySQL 8.4.3 上测试:

*************************** 1. row ***************************
                id: 1
 current_review_id: "{\"value\": \"b13d2f43-7abb-40f8-9867-6349c0c84c47\", \"recorded_timestamp\": 1696865721868}"
             value: b13d2f43-7abb-40f8-9867-6349c0c84c47
recorded_timestamp: 1696865721868
© www.soinside.com 2019 - 2024. All rights reserved.