如何在bigquery中将一个json列嵌套在另一个列中

Posted

技术标签:

【中文标题】如何在bigquery中将一个json列嵌套在另一个列中【英文标题】:How to nest a json column in another one in bigquery 【发布时间】:2021-11-22 21:18:18 【问题描述】:

我有一个带有 json 格式的 bigquery 字符串列,我们称它为 child_col,例如它的值为 '"code": "foo"'。 我正在尝试创建另一个字符串列,例如parent_col,带有一个 json 值,其中 child_cold 中的 json 作为嵌套属性,例如

'
  "code": "parent",
  "child": "code": "foo"
'

我在 Bigquery 中使用 TO_JSON_STRING 来做到这一点:

parent_col = TO_JSON_STRING(STRUCT('parent' AS code, child_col AS child))

这几乎可以工作,但将child_col 视为纯字符串,结果如下所示:

'
  "code": "parent",
  "child": "\"code\": \"foo\""
'

我尝试将child_col 嵌套在TO_JSON_STRING(STRUCT('parent' AS code, child_col AS child))JSON_VALUE()JSON_QUERY(child_col, '$')JSON_EXTRACT(child_col, '$'),第一个总是给出一个json null,而后两个仍然在逃避事情。例如

parent_col = TO_JSON_STRING(STRUCT('parent' AS code, JSON_QUERY(child_col, '$') AS child))

有什么简单的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

STRUCT() 将您的输入视为字符串,因此child 的值是整个字符串""code": "foo""。根据BigQuery JSON encodings,在使用 JSON 函数时,结构内的字符串特别是 双引号 (")反斜杠 (\)控制字符被自动转义。因此预计" 使用您的示例进行了转义。

无效的 UTF-8 字段名称可能会导致 JSON 无法解析。细绳 值根据 JSON 标准进行转义。具体来说, ”, , 并且 U+0000 到 U+001F 的控制字符被转义。

虽然这不是最佳解决方案,但可能的解决方法是替换大括号旁边的反斜杠 (\) 和双引号 ("),使其成为有效的 json 字符串。

WITH CTE as (
SELECT ' "code": "foo" ' AS child_col 
),
CTE_2 AS (
SELECT TO_JSON_STRING(STRUCT('parent' AS code, child_col AS child)) as json_val 
from CTE
)

SELECT REPLACE(REPLACE(REPLACE(json_val,'\\"','\"'),'\"',''),'\"','') as fixed_json 
FROM CTE_2

输出(参见fixed_json 字段):

【讨论】:

@user2268997 让我知道我的回答是否有帮助,以便我更新/删除它。 这是一个很好的方法。我正在寻找不需要字符串处理的东西。您不认为在STRUCT 构造函数中传递给JSON_EXTRACTJSON_QUERY 时,孩子被转义是一个错误吗? - 我希望它会导致嵌套的 STRUCTTO_JSON_STRING 不应该逃避任何东西。 我编辑了问题以明确我的意思

以上是关于如何在bigquery中将一个json列嵌套在另一个列中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中取消嵌套重复记录,一个数组给出列名,另一个给出列值?

BigQuery 合并 JSON 文档

BigQuery:从复杂的嵌套 JSON 键值创建列

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

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

BigQuery - 如何取消嵌套多个数组,并从一列分配值?