如何在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_EXTRACT
或JSON_QUERY
时,孩子被转义是一个错误吗? - 我希望它会导致嵌套的 STRUCT
和 TO_JSON_STRING
不应该逃避任何东西。
我编辑了问题以明确我的意思以上是关于如何在bigquery中将一个json列嵌套在另一个列中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BigQuery 中取消嵌套重复记录,一个数组给出列名,另一个给出列值?