【问题标题】:How to nest a json column in another one in bigquery如何在bigquery中将一个json列嵌套在另一个列中
【发布时间】: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))

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

【问题讨论】:

    标签: sql json google-bigquery


    【解决方案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 不应该逃避任何东西。
    • 我编辑了问题以明确我的意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    相关资源
    最近更新 更多