使用两组双引号取消嵌套字符串化 JSON

Posted

技术标签:

【中文标题】使用两组双引号取消嵌套字符串化 JSON【英文标题】:Unnesting stringified JSON with two sets of double quotes 【发布时间】:2021-11-13 16:09:07 【问题描述】:

我有一个 python 脚本,它轮询 API 并将响应存储在 BQ 表中,该表具有如下所示的分层字符串化 JSON 字段:

"""inputs"": ""Layer1"": ""Layer2"": ""Layer3"": ""item1"": 0.7, ""item2"": 10.0, ""item3"": 0.14"

我创建了以下查询以取消嵌套:

  ro.id,
  json_extract_scalar(s,
    '$.item1') AS item1,
  json_extract_scalar(s,
    '$.item2') AS item2,
  json_extract_scalar(s,
    '$.item3') AS item3
FROM
  `project.dataset.table` ro
LEFT JOIN
  UNNEST(json_extract_array(response)) AS r
LEFT JOIN
  UNNEST (json_extract_array("Layer1")) AS o
LEFT JOIN
  UNNEST (json_extract_array("Layer2")) AS sc
LEFT JOIN
  UNNEST (json_extract_array("Layer3")) AS s

查询按预期运行并构建表,但未嵌套字段中的所有数据均为空。

我无法控制脚本如何存储数据,所以我只能利用 SQL 来解决这个问题。这两组双引号是我的主要问题吗?如果是这样,解决这个问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

考虑以下方法

SELECT 
  json_extract_scalar(items,'$.item1') AS item1,
  json_extract_scalar(items,'$.item2') AS item2,
  json_extract_scalar(items,'$.item3') AS item3,
FROM `project.dataset.table` ro,
UNNEST([struct(json_extract(response, '$.inputs.Layer1.Layer2.Layer3') as items)])             

如果应用于您问题中的样本数据 - 输出是

【讨论】:

美丽。转换为 struct 是我缺少的部分,谢谢!

以上是关于使用两组双引号取消嵌套字符串化 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中取消嵌套 JSON 字符串化数组

BigQuery 中未嵌套的 json 对象的字符串化数组

为啥 preg_match_all 返回两个匹配项?

取消嵌套存储在列中的 JSON 字符串 [BigQuery]

在作为 EJS 模板传递以查看的字符串化 JSON 中转义单引号

如何在redshift上取消嵌套json字符串数组[重复]